numpy 基礎簡介
numpy 操作的主要對象是同類型的多維數(shù)組。它是一張表牲平,通常它的元素都是數(shù)字皂贩。并通過正整數(shù)元素索引。在 numpy 中維度稱為軸自沧,軸的數(shù)目稱為 rank 坟奥。
numpy的數(shù)組類被稱為ndarray。別名 array 拇厢。numpy.array 與標準Python庫類 array.array 不同爱谁,后者僅處理一維數(shù)組并提供較少的功能。 ndarray 對象則提供更關鍵的屬性:
- ndarray.ndim :數(shù)組的軸(維度)的個數(shù)孝偎。
In [1]: import numpy as np
In [17]: a = np.array([1,2,3,4,5])
In [18]: a
Out[18]: array([1, 2, 3, 4, 5])
In [19]: a.ndim
Out[19]: 1
In [9]: a = np.array([[1,2,3,4],[5,6,7,8]])
In [10]: a
Out[10]:
array([[1, 2, 3, 4],
[5, 6, 7, 8]])
In [11]: a.ndim
Out[11]: 2
In [12]: a = np.array([[1,2,3,4],[5,6,7,8],[12,13,14,15]])
In [13]: a
Out[13]:
array([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[12, 13, 14, 15]])
In [14]: a.ndim
Out[14]: 2
- ndarray.shape :數(shù)組的維度访敌。這是一個整數(shù)的元組,表示每個維度中數(shù)組的大小衣盾。對于有n行和m列的矩陣寺旺,shape將是(n,m)。因此势决,shape元組的長度就是rank或維度的個數(shù) ndim阻塑。
In [17]: a
Out[17]:
array([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[12, 13, 14, 15]])
In [18]: a.shape
Out[18]: (3, 4)
In [19]:
- ndarray.size:數(shù)組元素的總數(shù)。這等于shape的元素的乘積徽龟。
In [19]: a
Out[19]:
array([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[12, 13, 14, 15]])
In [20]: a.size
Out[20]: 12
In [21]:
- ndarray.dtype:一個描述數(shù)組中元素類型的對象叮姑。可以使用標準的Python類型創(chuàng)建或指定dtype。另外NumPy提供它自己的類型传透。例如numpy.int32耘沼、numpy.int16和numpy.float64。
In [24]: a
Out[24]:
array([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[12, 13, 14, 15]])
In [25]: a.dtype
Out[25]: dtype('int32')
In [26]:
- ndarray.itemsize:數(shù)組中每個元素的字節(jié)大小朱盐。例如群嗤,元素為 float64 類型的數(shù)組的 itemsize 為8(=64/8),而 complex32 類型的數(shù)組的 itemsize 為4(=32/8)兵琳。它等于 ndarray.dtype.itemsize 狂秘。
In [24]: a
Out[24]:
array([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[12, 13, 14, 15]])
In [25]: a.dtype
Out[25]: dtype('int32')
In [26]: a.itemsize
Out[26]: 4
In [27]: a.dtype.itemsize
Out[27]: 4
數(shù)組的創(chuàng)建
可以使用 array 函數(shù)從常規(guī)的python列表或元組中創(chuàng)建數(shù)組。得到的數(shù)組類型是從python列表中的元素推導出來的躯肌。
上面的例子大都是從常規(guī)的python列表創(chuàng)建的:
In [39]: a = np.array((1,2,3))
In [40]: a
Out[40]: array([1, 2, 3])
In [41]: a = np.array(((1,2,3),(4,5,6)))
In [42]: a
Out[42]:
array([[1, 2, 3],
[4, 5, 6]])
結合起來也是可以的:
In [43]: a = np.array([(1,2,3),(4,5,6)])
In [44]: a
Out[44]:
array([[1, 2, 3],
[4, 5, 6]])
數(shù)組的類型也是可以在創(chuàng)建的時候就指定:
In [2]: a = np.array([[1,2,3],[4,5,6]],dtype=complex)
In [3]: a
Out[3]:
array([[1.+0.j, 2.+0.j, 3.+0.j],
[4.+0.j, 5.+0.j, 6.+0.j]])
complex 是復數(shù)的意思者春。
通常,數(shù)組的元素最初是未知的清女,但它的大小是已知的钱烟。因此,NumPy提供了幾個函數(shù)來創(chuàng)建具有初始占位符內(nèi)容的數(shù)組嫡丙。這就減少了數(shù)組增長的必要拴袭,因為數(shù)組增長的操作花費很大。
- 函數(shù) zeros 創(chuàng)建一個由 0 組成的數(shù)組:
In [4]: a = np.zeros((3,4))
In [5]: a
Out[5]:
array([[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]])
- 函數(shù) ones 創(chuàng)建一個由 1 組成的數(shù)組:
In [6]: a = np.ones((3,4))
In [7]: a
Out[7]:
array([[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]])
- 函數(shù) empty 內(nèi)容是隨機的并且取決于存儲器的狀態(tài)曙博。默認情況下拥刻,創(chuàng)建的數(shù)組的dtype是 float64。
In [15]: a
Out[15]:
array([[1.69122046e-306, 1.31996133e-285, 1.32001905e-285],
[2.22129839e-285, 1.32003829e-285, 1.31963425e-285],
[1.25972084e-285, 0.00000000e+000, 0.00000000e+000]])
In [16]: a.dtype
Out[16]: dtype('float64')
- 創(chuàng)建數(shù)字序列父泳,NumPy提供了一個類似于 range 的函數(shù)般哼,該函數(shù)返回數(shù)組而不是列表。
In [21]: np.arange(0,2,0.2)
Out[21]: array([0. , 0.2, 0.4, 0.6, 0.8, 1. , 1.2, 1.4, 1.6, 1.8])
In [22]: np.arange(1,5,2)
Out[22]: array([1, 3])
打印數(shù)組
當你打印數(shù)組時尘吗,NumPy以與嵌套列表類似的方式顯示它逝她,但是具有以下布局:
- 最后一個軸從左到右打印,
- 倒數(shù)第二個從上到下打印睬捶,
- 其余的也從上到下打印黔宛,每個切片與下一個用空行分開。
一維數(shù)組被打印為行擒贸、二維為矩陣和三維為矩陣列表臀晃。
In [24]: a
Out[24]: array([1, 3])
In [25]: print(a)
[1 3]
In [26]: a = np.array(([1,2,3],[4,5,6]))
In [27]: print(a)
[[1 2 3]
[4 5 6]]
In [28]: c = np.arange(24).reshape(2,3,4)
In [29]: print(c)
[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]
基本操作
數(shù)組上的算術運算符使用元素級別。加減乘除都是每個元素之間的運算介劫。
>>> a = np.array( [20,30,40,50] )
>>> b = np.arange( 4 )
>>> b
array([0, 1, 2, 3])
>>> c = a-b
>>> c
array([20, 29, 38, 47])
>>> b**2
array([0, 1, 4, 9])
>>> 10*np.sin(a)
array([ 9.12945251, -9.88031624, 7.4511316 , -2.62374854])
>>> a<35
array([ True, True, False, False])
- 一些函數(shù)
In [36]: a
Out[36]:
array([[1, 2, 3],
[4, 5, 6]])
In [37]: a.max()
Out[37]: 6
In [38]: a.min()
Out[38]: 1
In [39]: a.sum()
Out[39]: 21
- 默認情況下徽惋,這些操作適用于數(shù)組,就好像它是數(shù)字列表一樣座韵,無論其形狀如何险绘。但是踢京,通過指定 axis 參數(shù),你可以沿著數(shù)組的指定軸應用操作:
In [4]: np.arange(12).reshape(3,4)
Out[4]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
In [5]: a = np.arange(12).reshape(3,4)
In [6]: a.min(axis=0)
Out[6]: array([0, 1, 2, 3])
In [7]: a.min(axis=1)
Out[7]: array([0, 4, 8])
通用函數(shù)
NumPy提供了常見的數(shù)學函數(shù)宦棺,如sin瓣距,cos和exp。在NumPy中代咸,這些函數(shù)在數(shù)組上按元素級別操作蹈丸,產(chǎn)生一個數(shù)組作為輸出。
>>> B = np.arange(3)
>>> B
array([0, 1, 2])
>>> np.exp(B)
array([ 1. , 2.71828183, 7.3890561 ])
>>> np.sqrt(B)
array([ 0. , 1. , 1.41421356])
>>> C = np.array([2., -1., 4.])
>>> np.add(B, C)
array([ 2., 0., 6.])