Numpy 數組操作
Numpy 中包含了一些函數用于處理數組,本節重點介紹如下幾類:
- 修改數組形狀;
- 翻轉數組;
- 格式轉換。
1. 修改數組形狀
常用的修改數組形狀的函數有:
函數 | 說明 |
---|---|
reshape | 不改變數據的條件下修改形狀 |
flat | 數組元素迭代器 |
flatten | 返回一份數組拷貝,對拷貝所做的修改不會影響原始數組 |
ravel | 返回展開數組 |
1.1 reshape
numpy.reshape 函數可以在不改變數據的條件下修改形狀,其函數原型如下:
numpy.reshape(arr, newshape, order='C')
參數 | 說明 |
---|---|
arr | 待修改形狀的數組 |
newshape | 整數或者整數數組,新的形狀應當兼容原有形狀 |
order | ‘C’ – 按行,‘F’ – 按列,‘A’ – 原順序,‘k’ – 元素在內存中的出現順序。 |
案例
生成一維數組,并利用 reshape 進行數組形狀的重整:
arr0 = np.arange(8).reshape(2,4)
輸出結果為:
array([[0, 1, 2, 3],
[4, 5, 6, 7]])
1.2 flat
numpy.ndarray.flat 是一個數組元素迭代器,可以利用for循環對迭代器進行遍歷。
案例
查閱數組 arr0 中的元素
for element in arr0.flat:
print(element)
程序執行結果為:
0
1
2
3
4
5
6
7
1.3 flatten
numpy.ndarray.flatten返回一份數組拷貝,并折疊為一維的數組。對拷貝所做的修改不會影響原始數組,函數原型如下:
ndarray.flatten(order='C')
其中,order 可選:‘C’ – 按行,‘F’ – 按列,‘A’ – 原順序,‘K’ – 元素在內存中的出現順序。
案例
將數組 arr0 以特定順序展開:
print("將arr0以行順序展開:", arr0.flatten(order='C'))
print("將arr0以列順序展開:", arr0.flatten(order='F'))
執行結果為:
將arr0以行順序展開: [0 1 2 3 4 5 6 7]
將arr0以列順序展開: [0 4 1 5 2 6 3 7]
1.4 ravel
numpy.ravel() 展平的數組元素,順序通常是"C風格",返回的是數組視圖(view),修改會影響原始數組。
該函數接收兩個參數:
numpy.ravel(a, order='C')
其中,order 可選:‘C’ – 按行,‘F’ – 按列,‘A’ – 原順序,‘K’ – 元素在內存中的出現順序。
案例
arr_r = np.ravel(arr0, order='C')
展開結果為:
arr_r
out:
array([0, 1, 2, 3, 4, 5, 6, 7])
通過切片賦值的方法,顯式地改變 arr_r 的值,查看 arr0 的變化:
arr_r[0] = 100
arr0
out:
array([[100, 1, 2, 3],
[ 4, 5, 6, 7]])
可以看到,雖然利用 ravel 方法對 arr0 進行了展開,但是對展開后的結果所做的修改,也會對應地出現在 arr0 上。
2. 翻轉數組
numpy.transpose 函數用于對換數組的維度。
案例
調換 arr0 的數組維度,達到轉置的效果:
np.transpose(arr0)
out:
array([[100, 4],
[ 1, 5],
[ 2, 6],
[ 3, 7]])
類似地,上述案例可以寫為:
arr0.transpose()
out:
array([[100, 4],
[ 1, 5],
[ 2, 6],
[ 3, 7]])
或者:
arr0.T
out:
array([[100, 4],
[ 1, 5],
[ 2, 6],
[ 3, 7]])
3. 格式轉換
借助于 tolist(),可以快速把 ndarray 格式的數組,轉變為列表,方便在某些情況下使用。
案例
把 arr0 轉化為列表:
arr0.tolist()
out:
[[100, 1, 2, 3], [4, 5, 6, 7]]
可以看到,對于二維數組,轉化后的結果是一個兩層嵌套列表。
4. 小結
本節重點介紹數組操作的三種方法:修改數組形狀、翻轉數組以及轉化數組為列表。特別要注意的是ravel() 函數,返回的是原始數組的視圖,對結果的修改會對應地體現在原始數組上。