Numpy 學習筆記

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>

建立

從 list 或者 tuple

>>> 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.]])

https://www.ouyangsong.com/po...

相關文章
相關標籤/搜索