numpy作為一個強大的數值計算庫,提供了對多維陣列的很多便捷操作,
承接上一篇陣列的創建,本篇主要介紹一些陣列的基本操作,
1. 子陣列
首先介紹獲取子陣列的方法,提取已有資料的一部分來參與計算是比較常用的功能,
對于一維陣列,提取子陣列:arr[start:stop:step]
- start:從哪個下標開始(下標從 0 開始)
- stop:到哪個下標結束(下標不包括 stop 這個值)
- step:間隔幾個元素
arr = np.array(range(10)) # 生成 0~9 10個元素
print(arr[::2]) # 偶數
print(arr[1::2]) # 奇數
print(arr[1:6:2]) # 前六個數中的奇數
print(arr[::-1]) # 逆序
#運行結果
[0 2 4 6 8]
[1 3 5 7 9]
[1 3 5]
[9 8 7 6 5 4 3 2 1 0]
對于多維陣列,同樣可以使用上面的方式,陣列有幾維,就可以使用幾次 start:stop:step,
比如下面的二維陣列:
arr = np.array([range(6), range(1, 7),
range(2, 8), range(3, 9),
range(4, 10)])
print(arr)
#運行結果
[[0 1 2 3 4 5]
[1 2 3 4 5 6]
[2 3 4 5 6 7]
[3 4 5 6 7 8]
[4 5 6 7 8 9]]
print(arr[::2, ::2])
#運行結果
[[0 2 4]
[2 4 6]
[4 6 8]]
也就是按行取第 1,3,5行,然后按列取第 1,3,5列,
2. 陣列副本
當我們提取子陣列之后,如果對子陣列進行修改,那么原始的陣列也會變化,
這個因為陣列是參考型別,當陣列的資料量很大的時候,記憶體占用會比較低,
比如:
arr = np.array(range(5))
arr2 = arr[::2]
arr2[2] = 99
print(arr)
#運行結果
[ 0 1 2 3 99]
print(arr2)
#運行結果
[ 0 2 99]
子陣列修改之后,原始陣列也改變了,
如果要避免修改原始陣列,就要建立子陣列的副本,也就是 copy 方法,
arr = np.array(range(5))
arr2 = arr[::2].copy() # 通過copy方法建立副本
arr2[2] = 99
print(arr)
#運行結果
[0 1 2 3 4]
print(arr2)
#運行結果
[ 0 2 99]
3. 陣列變形
進行資料分析時,我們常常得到的是線性的資料序列,也就是一維陣列,
在numpy中,從一維變到多維非常方便,
#一維變多維
arr = list(range(9))
print(arr)
#運行結果
[0, 1, 2, 3, 4, 5, 6, 7, 8]
arr = np.array(arr).reshape((3, 3))
print(arr)
#運行結果
[[0 1 2]
[3 4 5]
[6 7 8]]
注意,變換前后元素的總數量要一直,比如上面的例子中,
變換前一維陣列有9個元素,變換成 3x3 的二維陣列,也是9個元素,
如果變換成 3x4 或者 2x3 的二維陣列,就會出錯,
除了二維陣列,變成三維陣列也一樣:
arr = np.array(range(24)).reshape((2, 3, 4))
print(arr)
#運行結果
[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]
4. 拼接和拆分
最后一個基本操作是陣列的拼接和拆分,
4.1. 拼接
拼接有兩個方向,水平拼接和垂直拼接,拼接的陣列個數不限,
比如,下面的示例是3個陣列拼接在一起,
arr1 = np.array([range(1, 4),
range(1, 4),
range(1, 4)])
arr2 = np.array([range(4, 7),
range(4, 7),
range(4, 7)])
arr3 = np.array([range(7, 10),
range(7, 10),
range(7, 10)])
arr = np.concatenate([arr1, arr2, arr3])
print(arr)
#運行結果
[[1 2 3]
[1 2 3]
[1 2 3]
[4 5 6]
[4 5 6]
[4 5 6]
[7 8 9]
[7 8 9]
[7 8 9]]
arr = np.concatenate([arr1, arr2, arr3], axis=1)
print(arr)
#運行結果
[[1 2 3 4 5 6 7 8 9]
[1 2 3 4 5 6 7 8 9]
[1 2 3 4 5 6 7 8 9]]
concatenate 函式用來拼接陣列,默認是垂直方向拼接,設定 axis=1,按照水平方向拼接,
如果覺得記引數麻煩,記不住哪個是水平拼接,哪個是垂直拼接,還有兩個專門拼接的函式,
vstack(垂直拼接)和hstack(水平拼接),
arr = np.vstack([arr1, arr2, arr3])
print(arr)
#運行結果
[[1 2 3]
[1 2 3]
[1 2 3]
[4 5 6]
[4 5 6]
[4 5 6]
[7 8 9]
[7 8 9]
[7 8 9]]
arr = np.hstack([arr1, arr2, arr3])
print(arr)
#運行結果
[[1 2 3 4 5 6 7 8 9]
[1 2 3 4 5 6 7 8 9]
[1 2 3 4 5 6 7 8 9]]
4.2. 拆分
拆分陣列時,通過設定拆分點的下標,可以將陣列拆分成任意長短的多個陣列,
比如:
arr = np.array(range(1, 10))
arr1 = np.split(arr, [1, 5]) # 在下標 1 和 5 的地方拆分
print(arr1)
#運行結果
[array([1]), array([2, 3, 4, 5]), array([6, 7, 8, 9])]
上面的示例中,下標1對應的值是2,下標5對應的值是6,
有2個拆分點,所以拆分成3個陣列,
同樣,陣列的拆分也有2個簡便的方法:vsplit和hsplit,
拆分多維陣列時,可以按照垂直和水平兩個方向拆分,
arr = np.array(range(1, 10)).reshape((3, 3))
print(arr)
#運行結果
[[1 2 3]
[4 5 6]
[7 8 9]]
print(np.vsplit(arr, [1]))
#運行結果
[array([[1, 2, 3]]),
array([[4, 5, 6],
[7, 8, 9]])]
print(np.hsplit(arr, [1]))
#運行結果
[array([[1],
[4],
[7]]),
array([[2, 3],
[5, 6],
[8, 9]])]
垂直拆分時,拆分點是下標1的行,也就是從第二行開始拆分,
水平拆分時,拆分點是下標1的列,也就是從第二列開始拆分,
超過二維的陣列也可以 vsplit 和 hsplit,只是結果看上去沒那么直觀,
5. 總結回顧
本篇主要介紹的是numpy陣列的基本操作,包括:
- 提取子陣列
- 創建陣列副本
- 陣列變形
- 拼接和拆分
這些基本操作是進行實際的數值計算前經常會使用到的,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/555667.html
標籤:其他
下一篇:返回列表
