NumPy — 创建全零、全1、空、arange 数组,array 对象类型,astype 转换数据类型,数组和标量以及数组之间的运算,NumPy 数组共享内存
NumPy 簡介
一個用 python 實現的科學計算包。包括:
1、一個強大的 N 維數組對象 Array ;
2、比較成熟的(廣播)函數庫;
3、用于整合 C/C++ 和 Fortran 代碼的工具包;
4、實用的線性代數、傅里葉變換和隨機數生成函數
NumPy 特點是其 N 維數組對象 (即 ndarray)。依照標準的 NumPy 的約定,即總是使用 import numpy as np 導入 NumPy 包。
1. 創建 ndarray
使用 array 函數,它接受一切序列型的對象,然后產生一個新的含有傳入數據的 NumPy 數組。
In [7]: a = [1, 2, 3.5, 0, 4]In [8]: np.array(a)
Out[8]: array([1. , 2. , 3.5, 0. , 4. ])
嵌套序列會被轉換成一個多維數組
In [9]: data = [[1,2,3,4],[5,6,7,8]]In [10]: np.array(data)
Out[10]:
array([[1, 2, 3, 4],[5, 6, 7, 8]])
除非顯示地說明,np.array 會嘗試為新建的這個數組推斷出一個較為合適的數據類型。保存在一個特殊的 dtype 對象中。
In [6]: arr = np.array(data)In [7]: arr.dtype
Out[7]: dtype('int32')
-
zeros: 創建指定長度的全 0 數組 -
ones: 創建指定形狀的全 1 數組 -
empty: 創建一個沒有任何具體值的數組 -
arange: 是Python內置函數range的數組版
In [8]: np.zeros(5)
Out[8]: array([0., 0., 0., 0., 0.])In [9]: np.ones(5)
Out[9]: array([1., 1., 1., 1., 1.])In [11]: np.empty((2,3))
Out[11]:
array([[1.53153305e-316, 1.53436276e-316, 2.50013513e-315],[3.58787191e-316, 2.46289313e-316, 2.46289590e-316]])In [12]: np.arange(10)
Out[12]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
2. ndarray的數據類型
數組的數據類型 dtype 是一個特殊的對象,它含有 ndarray 將一塊內存解釋為特定數據類型所需的信息。
In [13]: arr1 = np.array([1,2,3], dtype=np.int32)In [14]: arr2 = np.array([1,2,3], dtype=np.float64)In [15]: arr1.dtype
Out[15]: dtype('int32')In [16]: arr2.dtype
Out[16]: dtype('float64')
通過 ndarray 的 astype 方法可以顯式地轉化 dtype
In [19]: arr = np.array([1,2,3,4])In [20]: arr.dtype
Out[20]: dtype('int32')In [21]: float_arr = arr.astype(np.float64)In [23]: float_arr.dtype
Out[23]: dtype('float64')
3. 數組和標量以及數組之間的運算
數組和標量進行計算,計算過程是直接把數組里的元素和標量逐個進行計算,需要注意的是, 乘法是對應元素相乘, 不是矩陣內積, 矩陣內積使用的是 np.dot() 函數。
In [25]: data = np.array([[1,2,3,4],[5,6,7,8]])In [26]: data
Out[26]:
array([[1, 2, 3, 4],[5, 6, 7, 8]])In [27]: data + 10
Out[27]:
array([[11, 12, 13, 14],[15, 16, 17, 18]])In [28]: data * 3
Out[28]:
array([[ 3, 6, 9, 12],[15, 18, 21, 24]])In [29]: data * data
Out[29]:
array([[ 1, 4, 9, 16],[25, 36, 49, 64]])
4. NumPy 數組共享內存
如果要獨立保存,需要顯式地備份。可以使用 np.may_share_memory() 函數來判斷兩個數組是否共享內存。
In [1]: import numpy as npIn [2]: a = np.arange(6)In [3]: b = a[2:5]In [4]: a
Out[4]: array([0, 1, 2, 3, 4, 5])In [5]: b
Out[5]: array([2, 3, 4])In [6]: b[1] = 100In [7]: b
Out[7]: array([ 2, 100, 4])In [8]: a
Out[8]: array([ 0, 1, 2, 100, 4, 5])In [9]: np.may_share_memory(a, b)
Out[9]: TrueIn [10]: b = a[2:6].copy()In [11]: b
Out[11]: array([ 2, 100, 4, 5])In [12]: b[1] = 3In [13]: b
Out[13]: array([2, 3, 4, 5])In [14]: a
Out[14]: array([ 0, 1, 2, 100, 4, 5])In [15]: np.may_share_memory(a, b)
Out[15]: False
4. 基本的索引和切片
4.1 一維數組
In [29]: arr = np.arange(6)In [30]: arrOut[30]: array([0, 1, 2, 3, 4, 5])In [31]: arr[3]Out[31]: 3In [32]: arr[2:5]Out[32]: array([2, 3, 4])In [33]: arr[5] = 100In [34]: arrOut[34]: array([ 0, 1, 2, 3, 4, 100])
4.2 二維數組
In [35]: arr_2d = np.array([[1,2,3],[4,5,6],[7,8,9]])In [36]: arr_2dOut[36]: array([[1, 2, 3],[4, 5, 6],[7, 8, 9]])In [37]: arr_2d[1]Out[37]: array([4, 5, 6])In [38]: arr_2d[0][2]Out[38]: 3# arr_2d[0][2] 與 arr_2d[0,2] 等價In [39]: arr_2d[0,2]Out[39]: 3
?
4.3 多維數組
4.4 布爾型索引
In [1]: import numpy as npIn [2]: names = np.array(['Bob','Joe','Will','Bob','Will'])In [3]: names
Out[3]: array(['Bob', 'Joe', 'Will', 'Bob', 'Will'], dtype='|S4')In [4]: names == 'Bob'
Out[4]: array([ True, False, False, True, False])
4.5 花式索引
指的是利用整數數組進行索引,假如有一個 8 × 4 數組
In [5]: arr = np.empty((8,4))In [6]: arr
Out[6]:
array([[4.82613331e-085, 6.96747054e+252, 5.81241635e+180,2.30074046e-312],[3.09270272e-316, 3.07615034e-316, 3.09946945e-316,3.07835624e-316],[3.09945364e-316, 3.09450863e-316, 3.09946628e-316,3.09451140e-316],[3.09950739e-316, 3.07614599e-316, 3.09947893e-316,3.09611889e-316],[3.09947577e-316, 3.07312626e-316, 3.07311243e-316,3.07311440e-316],[3.09612126e-316, 3.09612363e-316, 3.07306500e-316,3.07307685e-316],[3.07308081e-316, 3.09612601e-316, 3.07307883e-316,3.07308476e-316],[3.07307488e-316, 3.07308278e-316, 3.07309069e-316,3.07309464e-316]])In [7]: for i in range(8):...: arr[i] = i...: In [8]: arr
Out[8]:
array([[0., 0., 0., 0.],[1., 1., 1., 1.],[2., 2., 2., 2.],[3., 3., 3., 3.],[4., 4., 4., 4.],[5., 5., 5., 5.],[6., 6., 6., 6.],[7., 7., 7., 7.]])
為了以特定順序選取行子集,只需傳入一個用于指定順序的整數列表或者 ndarray 即可:
In [9]: arr[[4,3,0,6]]
Out[9]:
array([[4., 4., 4., 4.],[3., 3., 3., 3.],[0., 0., 0., 0.],[6., 6., 6., 6.]])
# 使用負索引將從末尾開始選取行
In [10]: arr[[-3,-5,-7]]
Out[10]:
array([[5., 5., 5., 5.],[3., 3., 3., 3.],[1., 1., 1., 1.]])
?
5. 數組轉置和軸對換
轉置返回的是原數據的視圖,不會對原數據進行任何復制操作。
In [11]: arr = np.arange(15).reshape((3,5))In [12]: arr
Out[12]:
array([[ 0, 1, 2, 3, 4],[ 5, 6, 7, 8, 9],[10, 11, 12, 13, 14]])In [13]: arr.T
Out[13]:
array([[ 0, 5, 10],[ 1, 6, 11],[ 2, 7, 12],[ 3, 8, 13],[ 4, 9, 14]])
?
6. 通用函數
通用函數是一種對 ndarray 中的數據執行元素級運算的函數。
-
一元通用函數
In [14]: arr = np.arange(0,10,2)In [15]: arr Out[15]: array([0, 2, 4, 6, 8]) # 計算各元素的平方根 In [16]: np.sqrt(arr) Out[16]: array([0. , 1.41421356, 2. , 2.44948974, 2.82842712]) # 計算各元素的指數 e的x次方 In [17]: np.exp(arr) Out[17]: array([1.00000000e+00, 7.38905610e+00, 5.45981500e+01, 4.03428793e+02,2.98095799e+03]) # 計算各元素的平方 In [18]: np.square(arr) Out[18]: array([ 0, 4, 16, 36, 64])
-
二元通用函數
In [19]: x = np.arange(0,10,2)In [20]: x Out[20]: array([0, 2, 4, 6, 8])In [21]: y = np.arange(5)In [22]: y Out[22]: array([0, 1, 2, 3, 4]) # 計算元素級的最大值 In [23]: np.maximum(x, y) Out[23]: array([0, 2, 4, 6, 8])?
7. 將條件邏輯表述為數組運算
numpy.where 函數時三元表達式 x if condition else y 的矢量化版本。假設我們要根據 cond 中的值選取 x 和 y 的值:當 cond 中的值為 True 時,選取 x 的值,否則從 y 中選取。
In [27]: x = np.array([1,2,3,4])In [28]: y = np.array([5,6,7,8])In [31]: cond = np.array([True, False, True, False])In [32]: np.where(cond,x,y)
Out[32]: array([1, 6, 3, 8])
np.where 的第二個和第三個參數不必時數組,它們都可以使標量值。在數據分析工作中,where 通常用于根據另一個數組而產生一個新的數組。
假設有一個由隨機數據組成的矩陣,我們希望將所有的正值替換為 2 ,負值替換為 -2
In [37]: arr = np.random.randn(4,4)In [38]: arr
Out[38]:
array([[-1.28836266, -0.79154759, -0.86565217, 1.01902521],[ 0.68554302, -0.08614421, -0.09703502, -0.63441371],[-0.93730255, -1.58755928, 0.91190601, -0.36010511],[ 0.63881326, -0.06695277, -0.89038554, -0.181366 ]])In [39]: np.where(arr>0, 2, -2)
Out[39]:
array([[-2, -2, -2, 2],[ 2, -2, -2, -2],[-2, -2, 2, -2],[ 2, -2, -2, -2]])In [40]: np.where(arr>0, 2, arr)
Out[40]:
array([[-1.28836266, -0.79154759, -0.86565217, 2. ],[ 2. , -0.08614421, -0.09703502, -0.63441371],[-0.93730255, -1.58755928, 2. , -0.36010511],[ 2. , -0.06695277, -0.89038554, -0.181366 ]])
?
8. 數學和統計方法
可以通過數組上的一組數學函數對整個數組或某個軸向的數據進行統計計算,sum、mean 以及標準差 std 等聚合計算,即可以當做數組的實例方法調用,也可以當做頂級 NumPy 函數使用:
In [52]: x = np.array([[1,2,3,4],[2,4,6,8]])In [53]: x
Out[53]:
array([[1, 2, 3, 4],[2, 4, 6, 8]])In [54]: x.sum()
Out[54]: 30
# mean 和 sum 這類函數可以接受一個 axis 參數(用于計算該軸方向上的統計值),最# 終結果是一個少一維的數組
In [55]: x.sum(axis=0)
Out[55]: array([ 3, 6, 9, 12])
# x.mean() 等價于 np.mean(x)
In [56]: x.mean()
Out[56]: 3.75In [58]: np.mean(x)
Out[58]: 3.75In [59]: np.sum(x)
Out[59]: 30In [60]: np.cumsum(x)
Out[60]: array([ 1, 3, 6, 10, 12, 16, 22, 30])
?
9. 用于布爾型數組的方法
在上述統計方法中,布爾值經常會被強制轉換為 1 (True) 和 0 (False),因此 sum 可以用來對布爾型數組中的 True 值進行計數。
any : 用于測試數組中是否存在一個或者多個 True
all : 用于檢查數組中所有值是否都是 True
In [61]: arr = np.random.randn(5)In [62]: arrOut[62]: array([-0.39136478, -1.41933952, 0.86864979, 0.57857464, -0.87099396])In [63]: (arr > 0).sum()Out[63]: 2In [64]: bools = np.array([True, False, True, False, True])In [65]: bools.any()Out[65]: TrueIn [66]: bools.all()Out[66]: False
10. 排序
In [67]: arr = np.random.randn(2,3)In [68]: arrOut[68]: array([[ 0.2112435 , 0.02708366, 1.7135565 ],[ 1.65791015, 1.84424113, -1.45151054]])In [69]: arr.sort()In [70]: arrOut[70]: array([[ 0.02708366, 0.2112435 , 1.7135565 ],[-1.45151054, 1.65791015, 1.84424113]])In [71]: arr.sort(1)In [72]: arrOut[72]: array([[ 0.02708366, 0.2112435 , 1.7135565 ],[-1.45151054, 1.65791015, 1.84424113]])# 多維數組可以在任何一個軸向上進行排序,只需將軸編號傳給 sort 即可In [73]: arr.sort(0)In [74]: arrOut[74]: array([[-1.45151054, 0.2112435 , 1.7135565 ],[ 0.02708366, 1.65791015, 1.84424113]])
11. 唯一化以及其它集合邏輯
In [76]: data = np.array([1,2,2,3,3,4,5,5])In [78]: np.unique(data)Out[78]: array([1, 2, 3, 4, 5])# in1d 用于測試 [4,8] 中的元素是否存在于 dataIn [79]: np.in1d(data,[4,8])Out[79]: array([False, False, False, False, False, True, False, False])
12. 將數組保存到磁盤以及讀取數組文件
NumPy 能夠讀寫磁盤上的文本數據或二進制數據。
- 二進制數據
np.save 和 np.load 是讀寫磁盤數組數據的兩個主要函數,默認情況下,數組是以未壓縮的原始二進制格式保存在擴展名為 .npy 的文件中的。
In [87]: arr = np.arange(10)In [88]: np.save('some_arry', arr)In [90]: np.load('some_arry.npy')Out[90]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])In [91]: b = np.array(['a','b','c','d'])In [92]: bOut[92]: array(['a', 'b', 'c', 'd'], dtype='|S1')# 通過 np.savez 可以將多個數組保存到一個壓縮文件中,加載.npz 文件時,會得到一# # 個類似字典的對象In [95]: np.savez('two_arr',arr, b)In [96]: t = np.load('two_arr.npz')In [101]: t.keys()Out[101]: ['arr_1', 'arr_0']In [102]: t['arr_0']Out[102]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])In [103]: t['arr_1']Out[103]: array(['a', 'b', 'c', 'd'], dtype='|S1')
-
文本數據
存取文本文件時使用 np.loadtxt 或者更專業的 np.genformtxt 將數據加載到普通的 NumPy數組中。后面主要使用 pandas 中的 read_csv 和 read_table 函數
13 線性代數計算
In [104]: x = np.array([[1,2,3],[4,5,6]])In [105]: y = np.array([[6,23],[-1,7],[8,9]])In [106]: xOut[106]: array([[1, 2, 3],[4, 5, 6]])In [107]: yOut[107]: array([[ 6, 23],[-1, 7],[ 8, 9]])# 等價于 np.dot(x,y)In [108]: x.dot(y) Out[108]: array([[ 28, 64],[ 67, 181]])
14 隨機數生成
In [109]: samples = np.random.normal(size=(4,4))In [110]: samplesOut[110]: array([[ 1.41219058e-01, -2.61687462e-01, -2.06544530e-01,5.57678964e-01],[ 2.32015368e+00, -1.21798230e+00, -1.71956114e-01,1.16218074e+00],[ 1.18028454e-05, 9.53225142e-01, -1.80567054e-01,4.87805927e-01],[-1.96884788e-01, -2.16054931e-01, -1.02006931e-01,1.98486048e-01]])```
總結
以上是生活随笔為你收集整理的NumPy — 创建全零、全1、空、arange 数组,array 对象类型,astype 转换数据类型,数组和标量以及数组之间的运算,NumPy 数组共享内存的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python+OpenCV 图像处理系列
- 下一篇: RabbitMQ 入门系列(1)— Ub