Numpy 的基本概念就是 ndarray 數組,全部屬性和操做都是圍繞它而來。python
<!--more-->數組
通常公認的導入方法以下:dom
import numpy as np
>>> a = np.array([[1, 2, 3], [4, 5, 6]], dtype=np.float64) >>> a.ndim # 維度 2 >>> a.shape # 數組形狀 (2, 3) >>> a.size # 元素個數 6 >>> a.dtype # 元素類型 dtype('float64') >>> a.itemsize # 元素字節數 8 >>> a.T # 轉置 array([[ 1., 4.], [ 2., 5.], [ 3., 6.]]) >>> a.flat # 返回 numpy.flatiter 對象,可迭代 <numpy.flatiter object at 0x7f97d9811800>
>>> a = np.array([[1, 2, 3], [4, 5, 6]])
指定 shape 和 dtype 生成。zeros 表明全是 0,ones 表明全是 1,empty 表明不初始化。函數
>>> a = np.zeros(shape=(2, 3), dtype=np.float64) >>> a array([[ 0., 0., 0.], [ 0., 0., 0.]]) >>> a = np.ones(shape=(2, 3), dtype=np.float64) >>> a array([[ 1., 1., 1.], [ 1., 1., 1.]])
複製別的 ndarry 的 shape 和 dtype 來建立。相似的,zeros_like 表明所有初始化爲 0,ones_like 表明所有初始化爲 1,empty_like 不初始化。post
>>> b = np.zeros_like(a) >>> a array([[ 1., 1., 1.], [ 1., 1., 1.]])
指定 shape 來用隨機數初始化。spa
>>> np.random.rand(2,3) # 0~1 均勻分佈 array([[ 0.31119951, 0.84391927, 0.1113187 ], [ 0.30782159, 0.67313418, 0.46963388]]) >>> np.random.randn(2,3) # 標準正態分佈 array([[-2.25811477, -0.34537208, 1.34830224], [-0.97916617, -1.17038121, -0.51444696]])
用序列,也就是起點,終點和步長,相似切片。code
>>> np.arange(start=1, stop=7, step=1, dtype=np.float64).reshape(2,3) array([[ 1., 2., 3.], [ 4., 5., 6.]]) >>> np.linspace(start=1, stop=4, num=6, endpoint=True, dtype=np.float64) # 均分 array([ 1. , 1.6, 2.2, 2.8, 3.4, 4. ]) >>> np.logspace(start=1, stop=4, num=6, endpoint=True, dtype=np.float64, base=10.0) # 等比數列 array([ 10. , 39.81071706, 158.48931925, 630.95734448, 2511.88643151, 10000. ])
使用生成函數。對象
>>> np.fromfunction(lambda i, j:i+j, (2, 3), dtype=np.float64) array([[ 0., 1., 2.], [ 1., 2., 3.]])
>>> np.save("a.npy", a) >>> b = np.load("a.npy") >>> b array([[ 1., 1., 1.], [ 1., 1., 1.]])
直接用位置或者經過條件來索引。索引
>>> a array([[ 1., 2., 3.], [-4., -5., -6.]]) >>> a[1,1] -5.0 >>> a[1, 0:1] array([-4.]) >>> a[1, :] array([-4., -5., -6.]) >>> a[1, ...] # 除了第一個緯度是 1,其餘緯度均可以 array([-4., -5., -6.]) >>> a[[1, 0], :] array([[-4., -5., -6.], [ 1., 2., 3.]]) >>> a[a<0] # bool 索引 array([-4., -5., -6.])
對上面索引到的位置賦值。內存
>>> a array([[ 1., 2., 3.], [-1., -1., -1.]]) >>> a.flat[1:2] = 5 >>> a array([[ 1., 5., 3.], [-1., -1., -1.]])
>>> b array([[ 1., 1., 1.], [ 1., 1., 1.]]) >>> a array([[ 1., 5., 3.], [-1., -1., -1.]]) >>> np.concatenate([a, b], axis=0) # 沿垂直方向拼接 array([[ 1., 5., 3.], [-1., -1., -1.], [ 1., 1., 1.], [ 1., 1., 1.]]) >>> np.concatenate([a, b], axis=1) # 沿水平方向拼接 array([[ 1., 5., 3., 1., 1., 1.], [-1., -1., -1., 1., 1., 1.]])
np.vstack([x,y])
,np.hstack([x,y])
,np.dstack([x,y])
分別對應 axis 等於 0,1,2。
指定索引編號分割。
np.array_split(a, [1,3], axis=0)
指定緯度,均等分。np.vsplit()
,np.hsplit()
,np.dsplit()
。
分紅淺度複製和深度複製,區別就是有沒有獨立的內存。
b = a.view() # 淺度複製 b = a.copy() # 深度複製
這裏主要掌握廣播,所謂廣播就是要麼相同形狀,要麼某一個維度上相同,要麼只有一個數字擴展成一個維度。
>>> a array([[ 2., 10., 6.], [ -2., 12., -2.]]) >>> a*a array([[ 4., 100., 36.], [ 4., 144., 4.]]) >>> a+1 array([[ 3., 11., 7.], [ -1., 13., -1.]]) >>> a*=2 >>> a array([[ 4., 20., 12.], [ -4., 24., -4.]])
利用內置函數來廣播。
>>> a array([[ 4., 20., 12.], [ -4., 24., -4.]]) >>> np.exp(a) array([[ 5.45981500e+01, 4.85165195e+08, 1.62754791e+05], [ 1.83156389e-02, 2.64891221e+10, 1.83156389e-02]]) >>> np.max(a) 24.0
線性函數相關。
>>> a array([[ 4., 20., 12.], [ -4., 24., -4.]]) >>> b = b.T >>> b array([[ 1., -1.], [ 5., 7.], [ 3., -1.]]) >>> a.dot(b) array([[ 140., 124.], [ 104., 176.]])