??NumPy(Numerical Python)是Python語言的一個擴(kuò)充程序庫凰萨。支持高級大量的維度數(shù)組與矩陣運算,此外也針對數(shù)組運算提供大量的數(shù)學(xué)函數(shù)庫娩井。
ndarray類
??NumPy中的數(shù)組類被稱為ndarray逗嫡,要注意的是numpy.array與Python標(biāo)準(zhǔn)庫中的array.array是不同的。ndarray具有如下比較重要的屬性:
ndarray.ndim
??ndarray.ndim表示數(shù)組的維度崖瞭。
ndarray.shape
??ndarray.shape是一個整型tuple,用來表示數(shù)組中的每個維度的大小撑毛。例如书聚,對于一個n行和m列的矩陣唧领,其shape為(n,m)。
ndarray.size
??ndarray.size表示數(shù)組中元素的個數(shù)雌续,其值等于shape中所有整數(shù)的乘積斩个。
ndarray.dtype
??ndarray.dtype用來描述數(shù)組中元素的類型,ndarray中的所有元素都必須是同一種類型驯杜,如果在構(gòu)造數(shù)組時受啥,傳入的參數(shù)不是同一類型的,不同的類型將進(jìn)行統(tǒng)一轉(zhuǎn)化鸽心。除了標(biāo)準(zhǔn)的Python類型外滚局,NumPy額外提供了一些自有的類型,如numpy.int32顽频、numpy.int16以及numpy.float64等藤肢。
ndarray.itemsize
??ndarray.itemsize用于表示數(shù)組中每個元素的字節(jié)大小。
代碼示例:
>>> import numpy as np
>>> 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.shape
(3, 5)
>>> a.ndim
2
>>> a.dtype.name
'int64'
>>> a.dtype
dtype('int64')
>>> a.size
15
>>> a.itemsize
8
>>> type(a)
<class 'numpy.ndarray'>
>>>
>>> b = np.array([1,2,3,4,5,6,7,8,9])
>>> b
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> c = np.array([1,2,3,4,5,6,'7','a','b'])
>>> c
array(['1', '2', '3', '4', '5', '6', '7', 'a', 'b'], dtype='<U21')
>>> type(b)
<class 'numpy.ndarray'>
>>> type(c)
<class 'numpy.ndarray'>
>>> c.dtype
dtype('<U21')
>>> b.dtype
dtype('int64')
>>> c.itemsize
84
>>> b.itemsize
8
數(shù)組創(chuàng)建
??NumPy中創(chuàng)建數(shù)組的方式有若干種糯景。最簡單的嘁圈,可以直接利用Python中常規(guī)的list和tuple進(jìn)行創(chuàng)建。
>>> import numpy as np
>>> a = np.array([1,2,3,4,5,6])
>>> b = np.array((1,2,3,4,5,6))
>>> a
array([1, 2, 3, 4, 5, 6])
>>> b
array([1, 2, 3, 4, 5, 6])
??這里需要注意傳入的參數(shù)蟀淮,下面的第一種方式是錯誤的:
>>> a = np.array(1,2,3,4) # WRONG
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: only 2 non-keyword arguments accepted
>>> a = np.array([1,2,3,4]) # RIGHT
??另外最住,傳入的參數(shù)必須是同一結(jié)構(gòu),不是同一結(jié)構(gòu)將發(fā)生轉(zhuǎn)換。
>>> import numpy as np
>>> a = np.array([1,2,3.5])
>>> a
array([1. , 2. , 3.5])
>>> b = np.array([1,2,3])
>>> b
array([1, 2, 3])
>>> c = np.array(['1',2,3])
>>> c
array(['1', '2', '3'], dtype='<U1')
>>>
??另外灭贷,array還可以將序列的序列轉(zhuǎn)換成二位數(shù)組温学,可以將序列的序列的序列轉(zhuǎn)換成三維數(shù)組略贮,以此類推甚疟。
>>> import numpy as np
>>> a = np.array([[1,2,3],[2,3,4]])
>>> a
array([[1, 2, 3],
[2, 3, 4]])
>>> b = np.array([[1,2,3],[2,3,4],[3,4,5]])
>>> b
array([[1, 2, 3],
[2, 3, 4],
[3, 4, 5]])
>>>
??另外,創(chuàng)建數(shù)組的時候逃延,可以明確的規(guī)定數(shù)組的類型览妖。
>>> c = np.array([1,2,3], dtype = complex)
>>> c
array([1.+0.j, 2.+0.j, 3.+0.j])
>>> d = np.array([[1,2,3],[4,5,6]], dtype = '<U1')
>>> d
array([['1', '2', '3'],
['4', '5', '6']], dtype='<U1')
>>>
??另外,NumPy還提供了便捷地創(chuàng)建特定數(shù)組的方式揽祥。
>>> import numpy as np
>>> a = np.zeros((3,4))
>>> a
array([[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]])
>>> b = np.zeros((2,2,2))
>>> b
array([[[0., 0.],
[0., 0.]],
[[0., 0.],
[0., 0.]]])
>>> c = np.ones((3,3))
>>> c
array([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]])
>>> d = np.ones((3,3), dtype = np.int16)
>>> d
array([[1, 1, 1],
[1, 1, 1],
[1, 1, 1]], dtype=int16)
>>> e = np.arange(15)
>>> e
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
>>> f = np.arange(15).reshape(3,5)
>>> f
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
>>> g = np.arange(0,15,3)
>>> g
array([ 0, 3, 6, 9, 12])
>>> h = np.arange(0,3,0.3)
>>> h
array([0. , 0.3, 0.6, 0.9, 1.2, 1.5, 1.8, 2.1, 2.4, 2.7])
>>> from numpy import pi
>>> np.linspace( 0, 2, 9 ) # 9 numbers from 0 to 2
array([ 0. , 0.25, 0.5 , 0.75, 1. , 1.25, 1.5 , 1.75, 2. ])
>>> x = np.linspace( 0, 2*pi, 100 ) # useful to evaluate function at lots of points
>>> f = np.sin(x)
基本操作
??對數(shù)組中的算術(shù)操作是元素對應(yīng)(elementwise)的讽膏,例如,對兩個數(shù)組進(jìn)行加減乘除拄丰,其結(jié)果是對兩個數(shù)組對一個位置上的數(shù)進(jìn)行加減乘除府树,數(shù)組算術(shù)操作的結(jié)果會存放在一個新建的數(shù)組中。
>>> import numpy as np
>>> a = np.array([10,20,30,40])
>>> b = np.arange(4)
>>> a
array([10, 20, 30, 40])
>>> b
array([0, 1, 2, 3])
>>> c = a - b
>>> c
array([10, 19, 28, 37])
>>> a
array([10, 20, 30, 40])
>>> b
array([0, 1, 2, 3])
>>> b**2
array([0, 1, 4, 9])
>>> b
array([0, 1, 2, 3])
>>> a<35
array([ True, True, True, False])
>>> a
array([10, 20, 30, 40])
??在NumPy中料按,*
用于數(shù)組間元素對應(yīng)的乘法奄侠,而不是矩陣乘法,矩陣乘法可以用dot()
方法來實現(xiàn)载矿。
>>> A = np.array([[1,2],[3,4]])
>>> B = np.array([[0,1],[0,1]])
>>> A
array([[1, 2],
[3, 4]])
>>> B
array([[0, 1],
[0, 1]])
>>> A*B # elementwise product
array([[0, 2],
[0, 4]])
>>> A.dot(B) # matrix product
array([[0, 3],
[0, 7]])
>>> np.dot(A,B) # another matrix product
array([[0, 3],
[0, 7]])
??有些操作垄潮,如*=
,+=
,-=
弯洗,/=
等操作旅急,會直接改變需要操作的數(shù)組,而不是創(chuàng)建一個新的數(shù)組牡整。
>>> a = np.ones((2,3), dtype = int)
>>> a
array([[1, 1, 1],
[1, 1, 1]])
>>> b = np.random.random((2,3))
>>> b
array([[0.27020018, 0.16904478, 0.29618462],
[0.45432616, 0.99311013, 0.56769309]])
>>> a *= 3
>>> a
array([[3, 3, 3],
[3, 3, 3]])
>>> b += 3
>>> b
array([[3.27020018, 3.16904478, 3.29618462],
[3.45432616, 3.99311013, 3.56769309]])
>>> b += a
>>> b
array([[6.27020018, 6.16904478, 6.29618462],
[6.45432616, 6.99311013, 6.56769309]])
>>> a
array([[3, 3, 3],
[3, 3, 3]])
>>> a += b # b is not automatically converted to integer type
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Cannot cast ufunc add output from dtype('float64') to dtype('int64') with casting rule 'same_kind'
>>>
??當(dāng)操作不同類型的數(shù)組時藐吮,最終的結(jié)果數(shù)組的類型取決于精度最寬的數(shù)組的類型。(即所謂的向上造型)
>>> a = np.ones(3, dtype=np.int32)
>>> b = np.linspace(0,pi,3)
>>> b.dtype.name
'float64'
>>> c = a+b
>>> c
array([ 1. , 2.57079633, 4.14159265])
>>> c.dtype.name
'float64'
>>> d = np.exp(c*1j)
>>> d
array([ 0.54030231+0.84147098j, -0.84147098+0.54030231j,
-0.54030231-0.84147098j])
>>> d.dtype.name
'complex128'
??ndarray類實現(xiàn)了許多操作數(shù)組的一元方法逃贝,如求和炎码、求最大值、求最小值等秋泳。
>>> a = np.random.random((2,3))
>>> a
array([[0.62181697, 0.26165654, 0.34994938],
[0.95619296, 0.24614291, 0.42120462]])
>>> a.sum()
2.8569633678947346
>>> a.min()
0.24614290611891454
>>> a.max()
0.9561929625193091
>>>
??除了上述一元方法以外潦闲,NumPy還提供了操作數(shù)組中特定行和列的一元方法,通過制定不同的axis
來實現(xiàn)迫皱。
>>> b = np.arange(12).reshape(3,4)
>>> b
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> b.sum(axis = 0) # sum of each column
array([12, 15, 18, 21])
>>> b.sum(axis = 1) # sum of each row
array([ 6, 22, 38])
>>> b.min(axis = 0) # min of each column
array([0, 1, 2, 3])
>>> b.min(axis = 1) # min of each row
array([0, 4, 8])
>>> b.max(axis = 0) # max of each column
array([ 8, 9, 10, 11])
>>> b.max(axis = 1) # max of each row
array([ 3, 7, 11])
>>> b.cumsum(axis = 1) # cumulative sum along each row
array([[ 0, 1, 3, 6],
[ 4, 9, 15, 22],
[ 8, 17, 27, 38]])
>>> b.cumsum(axis = 0) # cumulative sum along each column
array([[ 0, 1, 2, 3],
[ 4, 6, 8, 10],
[12, 15, 18, 21]])
>>>
通用方法
??NumPy提供了大量的通用數(shù)學(xué)和算術(shù)方法歉闰,比如常見的sin
、cos
卓起、具體可以參考如下:
all, any, apply_along_axis, argmax, argmin, argsort, average, bincount, ceil, clip, conj, corrcoef, cov, cross, cumprod, cumsum, diff, dot, floor, inner, inv, lexsort, max, maximum, mean, median, min, minimum, nonzero, outer, prod, re, round, sort, std, sum, trace, transpose, var, vdot, vectorize, where
>>> 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.])
數(shù)組索引和迭代
??與Python中定義的list一樣和敬,NumPy支持一維數(shù)組的索引、切片和迭代戏阅。
>>> a = np.arange(10)**3
>>> a
array([ 0, 1, 8, 27, 64, 125, 216, 343, 512, 729])
>>> a[3]
27
>>> a[2:5]
array([ 8, 27, 64])
>>> a[:6:2] = -1111
>>> a
array([-1111, 1, -1111, 27, -1111, 125, 216, 343, 512,
729])
>>> a[::-1]
array([ 729, 512, 343, 216, 125, -1111, 27, -1111, 1,
-1111])
??多維數(shù)組與一維數(shù)組相似昼弟,其在每個軸上都有一個對應(yīng)的索引(index),這些索引是在一個逗號分隔的元組(tuple)中給出的奕筐。
>>> b = np.arange(15).reshape(3,5)
>>> b
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
>>> b[2,3]
13
>>> b[3,3]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: index 3 is out of bounds for axis 0 with size 3
>>> b[0,0]
0
>>> b[0,4]
4
>>>
>>>
>>> b[:, 1]
array([ 1, 6, 11])
>>> b[1, :]
array([5, 6, 7, 8, 9])
>>> b[-1]
array([10, 11, 12, 13, 14])
>>> b.shape
(3, 5)
??這里需要注意的是舱痘,數(shù)組的第一個索引是從0開始的。一維數(shù)組和多維數(shù)組的迭代离赫,可以參考如下示例:
>>> for row in b:
... print(row)
...
[0 1 2 3]
[10 11 12 13]
[20 21 22 23]
[30 31 32 33]
[40 41 42 43]
>>> for element in b.flat:
... print(element)
...
0
1
2
3
10
11
12
13
20
21
22
23
30
31
32
33
40
41
42
43
??其中flat
屬性是array中的每個元素的迭代器芭逝。
shape操作
1. 改變數(shù)組的shape
??Numpy中數(shù)組shape由每個軸上元素的個數(shù)決定的。例如:
>>> import numpy as np
>>> a = np.ones((3,4), dtype = int)
>>> a
array([[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]])
>>> a.shape
(3, 4)
??NumPy中數(shù)組的shape是可以通過多種方式進(jìn)行改變的渊胸,下面展示三種改變數(shù)組shape而不改變當(dāng)前數(shù)組的方法旬盯,這三種方法返回一個特定shape的數(shù)組,但是并不改變原來的數(shù)組:
>>> import numpy as np
>>> a = np.ones((3,4), dtype = int)
>>> a
array([[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]])
>>> a.ravel()
array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1])
>>> a
array([[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]])
>>> b = a.ravel()
>>> b
array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1])
>>> a
array([[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]])
>>> c = a.reshape(2,-1)
>>> c
array([[1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1]])
>>> a
array([[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]])
>>> a.T
array([[1, 1, 1],
[1, 1, 1],
[1, 1, 1],
[1, 1, 1]])
>>> a
array([[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]])
>>> d = a.T
>>> d
array([[1, 1, 1],
[1, 1, 1],
[1, 1, 1],
[1, 1, 1]])
>>> a.shape
(3, 4)
>>> b.shape
(12,)
>>> c.shape
(2, 6)
>>> d.shape
(4, 3)
??除此之外翎猛,NumPy還提供了可以直接修改原始數(shù)組shape的方法——resize()
胖翰。resize()
方法和reshape()
方法的最主要區(qū)別在于,reshape()
方法返回一個特定shape的數(shù)組切厘,而resize()
方法會直接更改原數(shù)組萨咳。
>>> a = np.arange(12).reshape(3,4)
>>> a
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> a.resize(2,6)
>>> a
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11]])
2. 數(shù)組堆疊和切片
??NumPy支持將多個數(shù)據(jù)按照不同的軸進(jìn)行堆疊:
>>> a = np.floor(10*np.random.random((2,2)))
>>> a
array([[0., 8.],
[4., 8.]])
>>> b = np.floor(10*np.random.random((2,2)))
>>> b
array([[1., 4.],
[4., 1.]])
>>> np.vstack((a,b))
array([[0., 8.],
[4., 8.],
[1., 4.],
[4., 1.]])
>>> np.hstack((a,b))
array([[0., 8., 1., 4.],
[4., 8., 4., 1.]])
??hstack()
實現(xiàn)數(shù)組橫向堆疊,vstack()
實現(xiàn)數(shù)組縱向堆疊迂卢。
>>> from numpy import newaxis
>>> np.column_stack((a,b))
array([[4, 2],
[2, 8]])
>>> a[:, newaxis]
array([[4],
[2]])
>>> np.column_stack((a[:,newaxis],b[:,newaxis]))
array([[4, 2],
[2, 8]])
>>> np.vstack((a[:,newaxis],b[:,newaxis]))
array([[4],
[2],
[2],
[8]])
>>> np.r_[1:4,0,4]
array([1, 2, 3, 0, 4])
??除了支持?jǐn)?shù)組的橫向和縱向堆疊之外某弦,NumPy還支持?jǐn)?shù)組的橫向和縱向分割桐汤,示例如下:
>>> a = np.arange(12).reshape(3,4)
>>> a
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> np.split(a,3)
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]
>>> np.h
np.half( np.hanning( np.histogram( np.histogramdd( np.hstack(
np.hamming( np.heaviside( np.histogram2d( np.hsplit( np.hypot(
>>> np.hsplit(a,4)
[array([[0],
[4],
[8]]), array([[1],
[5],
[9]]), array([[ 2],
[ 6],
[10]]), array([[ 3],
[ 7],
[11]])]
>>> np.vsplit(a,3)
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]
>>>
??其中,split()
方法默認(rèn)為橫線分割靶壮。
復(fù)制和視圖
??NumPy中怔毛,數(shù)組的復(fù)制有三種方式:
- Python通用的地址復(fù)制:通過 b = a 復(fù)制 a 的值,b 與 a 指向同一地址腾降,改變 b 同時也改變 a拣度。
- 通過視圖
ndarray.view()
僅復(fù)制值,當(dāng)對 c 值進(jìn)行改變會改變 a 的對應(yīng)的值螃壤,而改變 c 的 shape 不改變 a 的 shape抗果。ndarray.copy()
進(jìn)行的完整的拷貝,產(chǎn)生一份完全相同的獨立的復(fù)制奸晴。
>>> a = np.arange(12)
>>> a
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
>>> b = a
>>> print(a is b)
True
>>>
>>>
>>> c = a.view()
>>> c
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
>>> print(a is c)
False
>>> c.shape = 2,6
>>> c
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11]])
>>> c[0,0] = 111
>>> c
array([[111, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11]])
>>> a
array([111, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
>>>
>>>
>>> d = a.copy()
>>> print(a is d)
False
>>> d.shape = 2,6
>>> d
array([[111, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11]])
>>> a
array([111, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
>>> d[0,0] = 999
>>> d
array([[ 999, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11]])
>>> a
array([111, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
>>>
NumPy功能和方法預(yù)覽
數(shù)組創(chuàng)建
arange, array, copy, empty, empty_like, eye, fromfile, fromfunction, identity, linspace, logspace, mgrid, ogrid, ones, ones_like, r, zeros, zeros_like
數(shù)組轉(zhuǎn)換
ndarray.astype, atleast_1d, atleast_2d, atleast_3d, mat
操作
array_split, column_stack, concatenate, diagonal, dsplit, dstack, hsplit, hstack, ndarray.item, newaxis, ravel, repeat, reshape, resize, squeeze, swapaxes, take, transpose, vsplit, vstack
問題
all, any, nonzero, where
排列
argmax, argmin, argsort, max, min, ptp, searchsorted, sort
運算
choose, compress, cumprod, cumsum, inner, ndarray.fill, imag, prod, put, putmask, real, sum
基礎(chǔ)統(tǒng)計
cov, mean, std, var
基本線性代數(shù)
cross, dot, outer, linalg.svd, vdot
參考:
https://segmentfault.com/a/1190000011836017
https://docs.scipy.org/doc/numpy-dev/user/quickstart.html