布爾值數組的方法
對於布爾值數組,有兩個非常有用的方法any和all。any檢查數組中是否至少有一個True,而all檢查是否每個值都是True。
bools = np.array([False, False, True, True])
print(bools.any())
print(bools.all())
#
True
False
這些方法也可以適用於非布爾值數組,所有的非0元素都會按True處理。
排序
和Python的內建列表類型相似,Numpy數組可以使用sort方法按位置排序。默認爲由小向大排列。
arr = np.random.randn(6)
print(arr)
arr.sort()
print(arr)
#
[-1.55099312 2.22923961 0.38059467 -0.42190283 -0.27717784 0.14534941]
[-1.55099312 -0.42190283 -0.27717784 0.14534941 0.38059467 2.22923961]
我們可以在多維數組中根據傳遞的axis值,沿着軸向對每個一維數組據段進行排序:
arr = np.random.randn(4, 4)
print(arr)
arr.sort(0)
print(arr)
arr.sort(1)
print(arr)
#
[[-0.49047551 -1.012509 0.27695532 0.8624097 ]
[ 1.23067939 0.31022283 0.91591414 1.33558621]
[ 0.00507471 -0.71394312 0.0363005 -1.60822262]
[ 1.83684391 -0.73575494 -1.51551864 -0.03682768]]
[[-0.49047551 -1.012509 -1.51551864 -1.60822262]
[ 0.00507471 -0.73575494 0.0363005 -0.03682768]
[ 1.23067939 -0.71394312 0.27695532 0.8624097 ]
[ 1.83684391 0.31022283 0.91591414 1.33558621]]
[[-1.60822262 -1.51551864 -1.012509 -0.49047551]
[-0.73575494 -0.03682768 0.00507471 0.0363005 ]
[-0.71394312 0.27695532 0.8624097 1.23067939]
[ 0.31022283 0.91591414 1.33558621 1.83684391]]
頂層的np.sort方法返回的是已經排序好的數組拷貝,而不是對原數組按位置排序。可以向sort()方法中傳入參數0或1,傳入0時按列排序,傳入1時按行排序,都是由小到大進行排列。
唯一值與其他集合邏輯
Numpy包含一些針對一維ndarray的基礎集合操作。常用的一個方法是np.unique,返回的是數組中唯一值排序後形成的數組。
names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])
print(np.unique(names))
ints = np.array([3, 3, 3, 2, 2, 1, 4, 4])
print(np.unique(ints))
#
['Bob' 'Joe' 'Will']
[1 2 3 4]
另一個函數,np.in1d,可以檢查一個數組中的值是否在另外一個數組中,並返回一個布爾值數組。
values = np.array([6, 0, 0, 1, 2, 2, 4, 5, 3])
result = np.in1d(values, [0, 1, 2, 3])
print(result)
#
[False True True True True True False False True]
方法 |
描述 |
unique(x) | 計算x的唯一值,並排序 |
intersect1d(x, y) | 計算x和y的交集,並排序 |
union1d(x, y) | 計算x和y的並集,並排序 |
in1d(x, y) | 計算x中的元素是否包含在y中,返回一個布爾值數組 |
setdiff1d(x, y) | 差集,在x中但不在y中的x的元素 |
setxor1d(x,y) | 異或集,在x或y中,但不屬於x、y交集的元素 |
使用數組進行文件輸入和輸出
Numpy可以在硬盤中將數據以文本或二進制文件的形式進行存入硬盤或由硬盤載入。
np.save和np.load是高效存取硬盤數據的兩大工具函數。數組在默認情況下是以未壓縮的格式進行存儲的,後綴名是 .npy。
arr = np.arange(10)
np.save('some_array', arr)
如果文件存放路徑中沒寫 .npy時,後綴名會被自動加上。結果如下:
硬盤上的數組可以使用np.load進行載入:
data = np.load('some_array.npy')
print(data)
#
[0 1 2 3 4 5 6 7 8 9]
我們可以使用np.savez並將數組作爲參數傳遞給該函數,用於在未壓縮文件中保存多個數組:
arr = np.arange(10)
np.savez('array_archive.npz', a=arr, b=arr)
結果如下:
arch = np.load('array_archive.npz')
print(arch['b'])
#
[0 1 2 3 4 5 6 7 8 9]
如果數據已經壓縮好了,可能會使用到np.savez_compressed將數據存入已經壓縮的文件:
arr = np.arange(10)
np.savez_compressed('array_archive.npz', a=arr, b=arr)