NumPy是高性能科學計算和數據分析的基礎包。它是pandas等其餘各類工具的基礎。python
(1)ndarray:一個多維數組結構,高效且節省空間。
(2)無需循環對整組數據進行快速運算的數學函數。
(3)線性代數、隨機數生成和傅里葉變換功能。數組
pip install numpy # 安裝方法 import numpy as np # 引用方法
import numpy as np import random # uniform隨機生成浮點數,這裏是隨機生成100~200之間的浮點數 a = [random.uniform(100.0, 200.0) for i in range(50)] print(a) x = 6.8 # 人民幣和美圓的匯率 # 方法一:使用循環 b = [] for ele in a: b.append(ele * x) print(b) # 方法二:使用numpy a = np.array(a) c = a * x print(c)
import numpy as np import random # uniform隨機生成浮點數,這裏是隨機生成100~200之間的浮點數 a = [random.uniform(100.0, 200.0) for i in range(50)] g = [random.randint(1, 10) for j in range(50)] d = np.array(g) sum = a*d.sum() # 全部商品總金額 print(sum)
建立ndarray:np.array(array_like)app
數組和列表的區別:dom
屬性 | 屬性含義 |
---|---|
T | 數組的轉置(對高維數組而言) |
size | 數組元素的個數 |
ndim | 數組的維數 |
shape | 數組的維度大小(元組形式) |
dtype | 數組元素的數據類型 |
能夠查看具體數據類型。ide
>>> import numpy as np >>> a = np.array(range(10)) >>> a array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> a.dtype dtype('int64')
查看當前存了多少個元素。函數
>>> a array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> a.size 10
查看數組的維數。工具
>>> a array([[1, 2, 3], [4, 5, 6]]) >>> a.ndim 2
返回一個元組,說明當前數組對象是一個幾行幾列的多維數組。性能
>>> a = np.array([[1,2,3], [4,5,6]]) >>> a array([[1, 2, 3], [4, 5, 6]]) >>> a.dtype dtype('int64') >>> a.size 6 >>> a.shape (2, 3) # 返回一個元組,說明是一個兩行三列的二維數組 # 三維數組 >>> a = np.array([[[1,2,3], [4,5,6]],[[1,2,3], [3,4,5]]]) >>> a array([[[1, 2, 3], [4, 5, 6]], [[1, 2, 3], [3, 4, 5]]]) >>> a.shape # 兩頁兩行三列的三維數組 (2, 2, 3)
還可使用reshape函數來調整數組大小ui
>>> a=np.arange(15) >>> a array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]) >>> a.reshape((3,5)) array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14]])
查看獲取對應位置元素spa
>>> a array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14]]) >>> a[0][0] 0 >>> a[0,0] 0
數組轉置。
>>> a = np.array([[1,2,3], [4,5,6]]) >>> a array([[1, 2, 3], [4, 5, 6]]) >>> a.T array([[1, 4], [2, 5], [3, 6]]) >>> a = a.T >>> a.T array([[1, 2, 3], [4, 5, 6]]) >>> _.T array([[1, 4], [2, 5], [3, 6]])
ndarray中絕大多數狀況下都是保存各類數字,基本不保存字符串數據。
類型 | 字節細分 |
---|---|
布爾型 | bool_ |
整型 | int_ int8 int16 int32 int64 |
無符號整型 | uint8 uint16 uint32 uint64 |
浮點型 | float_ float16 float32 float64 |
複數型 | complex_ complex64 complex128 |
注意:
(1)64位的整數最大值是:263-1=9223372036854775807;
(2)無符號整型只表示正數,所以64位的無符號整數最大值是:264-1=18446744073709551615
方法 | 描述 |
---|---|
array() | 將列表轉換爲數組,可選擇顯示指定dtype |
arange() | range的numpy版,支持浮點數 |
linespace() | 相似arange(),第三個參數爲數組長度 |
zeros() | 根據指定形狀和dtype建立全0數組 |
ones() | 根據指定形狀和dtype建立全1數組 |
empty() | 根據指定形狀和dtype建立空數組(隨機值) |
eye() | 根據指定邊長建立單位矩陣 |
zeros:生成值全爲0的數組。
ones:生成值全爲1的數組。
# 列表的方法 >>> np.array([0]*10) array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0]) # zeros()方法 >>> np.zeros(10) array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]) >>> a = np.zeros(10) >>> a.dtype dtype('float64') # 默認計算是浮點數 # 設置類型參數 >>> a = np.zeros(10, dtype='int') >>> a array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0]) # ones()方法生成全是全爲1的數組 >>> a = np.ones(10) >>> a array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
根據指定形狀和dtype建立空數組(隨機數)。取到內存內留存的值。
能夠先建立數組,再將這些值都覆蓋掉。
>>> a = np.empty(100) >>> a array([ 2.00000000e+000, 2.00000000e+000, 2.86558075e-322, ... 7.10580593e+159])
range的numpy版,支持浮點數。
>>> np.arange(10) array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) # 設置起始值和結束值 >>> np.arange(3,9) array([3, 4, 5, 6, 7, 8]) # 設置起始值、結束值和步長(python的range沒有步長設置) >>> np.arange(2,7,0.5) # 注意:步長能夠爲小數 array([2. , 2.5, 3. , 3.5, 4. , 4.5, 5. , 5.5, 6. , 6.5])
數學中的概念:線性空間。它與arange使用很是類似。但第三個參數不是步長仍是把數組分爲多少份。
>>> np.linspace(0,10,11) array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.]) >>> _.size 11 >>> np.linspace(0,9,20) array([0. , 0.47368421, 0.94736842, 1.42105263, 1.89473684, 2.36842105, 2.84210526, 3.31578947, 3.78947368, 4.26315789, 4.73684211, 5.21052632, 5.68421053, 6.15789474, 6.63157895, 7.10526316, 7.57894737, 8.05263158, 8.52631579, 9. ]) # 數學中應用 import numpy as np import matplotlib.pyplot as plt # python的繪圖庫 x = np.linspace(-10,10,10000) y = x**2 plt.plot(x,y) # 使用matplotlib來繪製點 plt.show()
應用執行效果以下:
生成線性代數中的單位矩陣。對角線爲1,其餘位置是0。
>>> np.eye(5) array([[1., 0., 0., 0., 0.], [0., 1., 0., 0., 0.], [0., 0., 1., 0., 0.], [0., 0., 0., 1., 0.], [0., 0., 0., 0., 1.]])
a+1 a*3 1//a a**0.5 a>5
>>> a = np.arange(10) >>> a array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> a+1 array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) >>> a*3 array([ 0, 3, 6, 9, 12, 15, 18, 21, 24, 27]) >>> 3/a array([ inf, 3. , 1.5 , 1. , 0.75 , 0.6 , 0.5 , 0.42857143, 0.375 , 0.33333333]) <string>:1: RuntimeWarning: divide by zero encountered in true_divide
a+b a/b a**b a%b a==b a>b
>>> b = np.arange(10,20) >>> a array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> b array([10, 11, 12, 13, 14, 15, 16, 17, 18, 19]) >>> a+b array([10, 12, 14, 16, 18, 20, 22, 24, 26, 28]) >>> a>b array([False, False, False, False, False, False, False, False, False, False]) >>> a[0]=20 >>> a>b array([ True, False, False, False, False, False, False, False, False, False])
ndarray對象的內容能夠經過索引或切片來訪問和修改,與 Python 中 list 的切片操做同樣。
ndarray 數組能夠基於 0 - n 的下標進行索引,切片對象能夠經過內置的 slice 函數,並設置 start, stop 及 step 參數進行,從原數組中切割出一個新數組。
# 一維數組的索引 >>> a=np.arange(10) >>> a array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> a[5] 5 # 多維數組的索引 >>> a = a.reshape((2,5)) >>> a array([[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]]) # (1)列表式寫法 >>> a[1][3] 8 # (2)新式寫法 >>> a[1,3] 8
# 一維數組的切片 >>> a = np.arange(15) >>> a array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]) >>> a[0:4] array([0, 1, 2, 3]) >>> a[:4] array([0, 1, 2, 3]) >>> a[4:] array([ 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]) # 多維數組的切片 >>> a = np.arange(15).reshape((3,5)) >>> a array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14]]) >>> a[0:2,0:2] # 切前兩行前兩列 array([[0, 1], [5, 6]]) >>> a[1:, 2:4] # 從第二行開始切,切第3-4列 array([[ 7, 8], [12, 13]])
數組切片和列表切片的不一樣:數組切片時並不會自動複製(而是建立一個視圖),在切片數組上的修改會影響原數組。
>>> a = np.arange(10) >>> a array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> b = list(range(10)) >>> b [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> c = a[0:4] >>> c array([0, 1, 2, 3]) >>> d = b[0:4] >>> d [0, 1, 2, 3] >>> c[0] = 20 >>> d[0] = 20 >>> c array([20, 1, 2, 3]) >>> d [20, 1, 2, 3] >>> a # 能夠看到對切片數組修改影響了原數組 array([20, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> b [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
copy()方法能夠建立數組的深拷貝。
>>> a[0] = 0 >>> a array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> c = a[0:4].copy() >>> c array([0, 1, 2, 3]) >>> c[0] = 20 >>> c array([20, 1, 2, 3]) >>> a array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
布爾型索引:將一樣大小的布爾數組傳進索引,會返回一個由全部True對應位置的元素的數組。
# 常規方法 >>> import random >>> a = [random.randint(0, 10) for i in range(20)] >>> a [8, 2, 4, 0, 9, 0, 1, 7, 10, 9, 4, 0, 5, 8, 5, 8, 4, 0, 3, 8] >>> filter(lambda x:x>5, a) <filter object at 0x11704b320> >>> list(filter(lambda x:x>5, a)) [8, 9, 7, 10, 9, 8, 8, 8] # 布爾索引解決 >>> a = np.array(a) # 列表轉化爲數組 >>> a array([ 8, 2, 4, 0, 9, 0, 1, 7, 10, 9, 4, 0, 5, 8, 5, 8, 4, 0, 3, 8]) >>> a[a>5] array([ 8, 9, 7, 10, 9, 8, 8, 8])
原理:數組和標量的運算,a > 5 會對a中的每個元素進行判斷,返回一個布爾數組。
布爾型索引,將一樣大小的布爾數組傳進索引,會返回一個由全部True對應位置的元素的數組。
>>> a array([ 8, 2, 4, 0, 9, 0, 1, 7, 10, 9, 4, 0, 5, 8, 5, 8, 4, 0, 3, 8]) >>> b = a[a>5] >>> b array([ 8, 9, 7, 10, 9, 8, 8, 8]) >>> b[b%2==0] array([ 8, 10, 8, 8, 8]) # 合併寫法 >>> a array([ 8, 2, 4, 0, 9, 0, 1, 7, 10, 9, 4, 0, 5, 8, 5, 8, 4, 0, 3, 8]) >>> a[(a>5) & (a%2==0)] # 與運算 注意:& 和 and的區別 array([ 8, 10, 8, 8, 8])
# 或運算,or關係 a[(a>5) | (a%2==0)] array([ 8, 2, 4, 0, 9, 0, 7, 10, 9, 4, 0, 8, 8, 4, 0, 8])
花式索引指的是利用整數數組進行索引。
花式索引根據索引數組的值做爲目標數組的某個軸的下標來取值。對於使用一維整型數組做爲索引,若是目標是一維數組,那麼索引的結果就是對應位置的元素;若是目標是二維數組,那麼就是對應下標的行。
花式索引跟切片不同,它老是將數據複製到新數組中。
>>> a = np.arange(20) >>> a array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]) >>> a[[1,3,4,6,7]] # 整數數組索引 array([1, 3, 4, 6, 7])
>>> a = np.arange(20).reshape(4,5) >>> a array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14], [15, 16, 17, 18, 19]]) >>> a[0, 2:4] array([2, 3]) >>> a[0]>2 array([False, False, False, True, True]) >>> a[0, a[0]>2] array([3, 4]) # 注意花式索引不能同時出如今逗號兩邊,好比想選擇六、八、1六、18 >>> a[[1,3], [1,3]] array([ 6, 18]) # 實際取的是a[1,1] 和a[3,3]的值 # 實際解法以下所示: >>> a[[1,3],:] # 第1行到第4行,列全切 array([[ 5, 6, 7, 8, 9], [15, 16, 17, 18, 19]]) >>> a[:,[1,3]] # 行全切,切第一列到第三列 array([[ 1, 3], [ 6, 8], [11, 13], [16, 18]]) >>> a[[1,3],:][:,[1,3]] array([[ 6, 8], [16, 18]])
通用函數:能同時對數組中全部元素進行運算的函數。常見通用函數以下所示:
abs,sqrt,exp,log,ceil,floor,rint,trunc,modf,isnan,isinf,cos,sin,tan
>>> a = np.arange(-5,5) >>> a array([-5, -4, -3, -2, -1, 0, 1, 2, 3, 4]) >>> np.abs(a) # 取絕對值 array([5, 4, 3, 2, 1, 0, 1, 2, 3, 4]) >>> abs(a) array([5, 4, 3, 2, 1, 0, 1, 2, 3, 4]) >>> np.sqrt(a) # 開方 <string>:1: RuntimeWarning: invalid value encountered in sqrt array([ nan, nan, nan, nan, nan, 0. , 1. , 1.41421356, 1.73205081, 2. ]) # 向下取整:單個是math.floor();批量是:np.floor() >>> import math >>> math.floor(-1.6) -2 >>> math.floor(1.6) 1 # 向上取整:單個是math.ceil(),批量是np.ceil() >>> math.ceil(1.6) 2 >>> math.ceil(-1.6) -1 # 四捨五入:round() >>> round(1.6) 2 >>> round(-1.6) -2 >>> round(-1.3) -1 # 批量操做 >>> a = np.arange(-5.5, 5.5) >>> a array([-5.5, -4.5, -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, 3.5, 4.5]) >>> np.floor(a) # 向下取整 array([-6., -5., -4., -3., -2., -1., 0., 1., 2., 3., 4.]) >>> np.ceil(a) # 向上取整 array([-5., -4., -3., -2., -1., -0., 1., 2., 3., 4., 5.]) >>> np.round(a) # 四捨五入 array([-6., -4., -4., -2., -2., -0., 0., 2., 2., 4., 4.]) >>> np.rint(a) # 四捨五入(同round()) array([-6., -4., -4., -2., -2., -0., 0., 2., 2., 4., 4.]) >>> np.trunc(a) # 截斷(丟棄小數部分) array([-5., -4., -3., -2., -1., -0., 0., 1., 2., 3., 4.]) # modf:整數和小數部分分拆 >>> a array([-5.5, -4.5, -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, 3.5, 4.5]) >>> np.modf(a) (array([-0.5, -0.5, -0.5, -0.5, -0.5, -0.5, 0.5, 0.5, 0.5, 0.5, 0.5]), array([-5., -4., -3., -2., -1., -0., 0., 1., 2., 3., 4.])) >>> k,y = np.modf(a) >>> k array([-0.5, -0.5, -0.5, -0.5, -0.5, -0.5, 0.5, 0.5, 0.5, 0.5, 0.5]) >>> y array([-5., -4., -3., -2., -1., -0., 0., 1., 2., 3., 4.])
add,substract,multiply,divide,power,mod,maximum,mininum
# maximum:對兩個數組每一個值均取最大值 >>> a array([3, 4, 5, 6, 7]) >>> b array([3, 0, 5, 0, 7]) >>> np.maximum(a,b) array([3, 4, 5, 6, 7]) # minimum:對兩個數組每一個值均取最小值 >>> np.minimum(a,b) array([3, 0, 5, 0, 7])
Numpy中建立特殊值:np.nan np.inf
在數據分析中,nan常被用做表示數據缺失值。
# python中有兩個浮點數特殊值 >>> float('3.5') 3.5 >>> float('nan') nan >>> float('inf') inf # nan(Not a Number):不等於任何浮點數(nan != nan) >>> a = np.arange(5) >>> a array([0, 1, 2, 3, 4]) >>> a/a <string>:1: RuntimeWarning: invalid value encountered in true_divide array([nan, 1., 1., 1., 1.]) >>> np.nan # 獲取nan值 nan >>> np.nan == np.nan # 兩個nan不相等,由於nan不等於任何值 False >>> b = a/a >>> b array([nan, 1., 1., 1., 1.]) >>> np.isnan(b) # 判斷出數組中哪些是nan值 array([ True, False, False, False, False]) >>> b[~(np.isnan(b))] # ~取反 array([1., 1., 1., 1.]) # inf(infinity):比任何浮點數都大,表示無窮大的數 >>> float('inf') > 10000000 True >>> a = np.array([3,4,5,6,7]) >>> b = np.array([3,0,5,0,7]) >>> a/b array([ 1., inf, 1., inf, 1.]) >>> np.inf == np.inf # 無窮大的數能夠相等 True # 過濾掉數組中inf的數 >>> c = a/b >>> c array([ 1., inf, 1., inf, 1.]) >>> c[c!=np.inf] array([1., 1., 1.]) # 利用isinf()的寫法 >>> c[~np.isinf(c)] array([1., 1., 1.])
>>> a array([3, 4, 5, 6, 7]) # sum:求和 >>> a.sum() 25 # mean:求平均數 >>> a.mean() 5.0 # var:求方差,方差表示整組數據的離散程度 >>> a.var() 2.0 # 方差公式驗證: >>> a array([3, 4, 5, 6, 7]) >>> ((3-5)**2 + (4-5)**2 + (5-5)**2 + (6-5)**2 + (7-5)**2)/5 2.0 # std:求標準差(對方差開根) >>> a.std() 1.4142135623730951 >>> math.sqrt(2) 1.4142135623730951 # 標準差和均值能夠估計整個數組的範圍 >>> a = np.arange(0,10,0.2) >>> a array([0. , 0.2, 0.4, 0.6, 0.8, 1. , 1.2, 1.4, 1.6, 1.8, 2. , 2.2, 2.4, 2.6, 2.8, 3. , 3.2, 3.4, 3.6, 3.8, 4. , 4.2, 4.4, 4.6, 4.8, 5. , 5.2, 5.4, 5.6, 5.8, 6. , 6.2, 6.4, 6.6, 6.8, 7. , 7.2, 7.4, 7.6, 7.8, 8. , 8.2, 8.4, 8.6, 8.8, 9. , 9.2, 9.4, 9.6, 9.8]) >>> a.mean() 4.9 >>> a.std() # 標準差 2.8861739379323628 >>> a.mean()-a.std() # 大概估計數組的範圍 2.0138260620676376 >>> a.mean()-2*a.std() -0.8723478758647252 >>> a.mean()+2*a.std() 10.672347875864727 # min:求最小值 >>> a.min() 0.0 # max:求最大值 >>> a.max() 9.8 # argmin:求最小值索引 >>> a.argmin() 0 # argmax:求最大值索引 >>> a.argmax() 49
# python默認的random模塊 >>> random.random() 0.5107400270751336 >>> random.randint(0,10) 9 >>> random.choice([1,3,4,5]) 5 # shuffle():用於將列表中元素打亂 >>> a = [1,3,4,5,7] >>> random.shuffle(a) # 打亂列表 >>> a [1, 4, 7, 3, 5] # uniform(a,b):用於生成一個指定範圍內的整數。其中參數a是下限,參數b是上限,生成的隨機數n:a<=n<=b >>> random.uniform(2.0,4.0) 2.190653911434251 # 隨機函數在np.random子包內方法 # rand:給定形狀產生隨機數組(0到1之間的數) >>> np.random.rand(10) array([0.28624648, 0.69121364, 0.74607992, 0.2587513 , 0.60445688, 0.2890542 , 0.88712216, 0.93544304, 0.99640741, 0.73059636]) # randint:給定形狀產生隨機整數 >>> np.random.randint(0,10) # 取範圍內隨機數 3 >>> np.random.randint(0,10,10) # 用隨機數生成一個有10個元素的數組 array([7, 5, 6, 8, 5, 4, 1, 9, 7, 4]) >>> np.random.randint(0,10,(3,5)) # 用隨機數生成一個三行五列的二維數組 array([[2, 1, 5, 0, 9], [5, 4, 8, 7, 3], [2, 0, 5, 9, 9]]) >>> np.random.randint(0,10,(3,5,5)) # 用隨機數生成一個三維數組 array([[[7, 4, 8, 5, 9], [8, 1, 4, 3, 5], [9, 8, 9, 3, 1], [8, 8, 7, 0, 7], [7, 0, 8, 6, 8]], [[3, 1, 8, 1, 2], [8, 2, 7, 6, 4], [4, 3, 8, 0, 6], [3, 5, 3, 1, 2], [4, 2, 6, 6, 2]], [[4, 5, 5, 4, 6], [0, 7, 5, 6, 6], [6, 4, 8, 8, 2], [5, 0, 3, 7, 9], [8, 5, 6, 2, 5]]]) # choice:給定形狀產生隨機選擇 >>> np.random.choice([1,2,3,4,5]) 2 >>> np.random.choice([1,2,3,4,5],10) array([1, 2, 1, 4, 1, 3, 2, 5, 3, 2]) # shuffle:與random.shuffle相同 # uniform:給定形狀產生隨機數組 >>> np.random.uniform(2.0,5.0) 2.9530512208056257 >>> np.random.uniform(2.0,5.0,10) array([3.9142783 , 4.71991751, 4.05954663, 4.13170221, 3.88043716, 2.00233882, 2.34833856, 2.48430517, 3.07240671, 3.4608536 ])