轉自http://blog.csdn.net/liyuanbhu/article/details/28611429
轉自http://blog.csdn.net/liyuanbhu/article/details/28870439
翻譯自官方文檔Tentative NumPy Tutorial,有刪節。
Numpy 入門教程
NumPy 提供了對多維數組的支持,與Python原生支持的List類型不同,數組的所有元素必須同樣的類型。數組的維度被稱爲axes,維數稱爲 rank。
Numpy的數組類型爲 ndarray, ndarray 的重要屬性包括:
- ndarray.ndim:數組的維數,也稱爲rank
- ndarray.shape:數組各維的大小tuple 類型,對一個n 行m 列的矩陣來說, shape 爲 (n,m)。
- ndarray.size:元素的總數。
- Ndarray.dtype:每個元素的類型,可以是 numpy.int32, numpy.int16, and numpy.float64 等。
- Ndarray.itemsize:每個元素佔用的字節數。
- Ndarray.data:指向數據內存。
一個簡單的例子:
-
>>> from numpy import *
-
>>> a = 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
-
'int32'
-
>>> a.itemsize
-
4
-
>>> a.size
-
15
-
>>> type(a)
-
numpy.ndarray
-
>>> b = array([6, 7, 8])
-
>>> b
-
array([6, 7, 8])
-
>>> type(b)
-
numpy.ndarray
生成數組
有許多種方法生成數組。比如,可以將Python list 或 tuple 轉化爲數組,轉化後的數組元素的類型由原來的對象的類型來決定。
-
>>> from numpy import *
-
>>> a = array( [2,3,4] )
-
>>> a
-
array([2, 3, 4])
-
>>> a.dtype
-
dtype('int32')
-
>>> b = array([1.2, 3.5, 5.1])
-
>>> b.dtype
-
dtype('float64')
-
>>> b = array( [ (1.5,2,3), (4,5,6) ] )
-
>>> b
-
array([[ 1.5, 2. , 3. ],
-
[ 4. , 5. , 6. ]])
生成數組時也可以指定元素的數據類型:
-
>>> c = array( [ [1,2], [3,4] ], dtype=complex )
-
>>> c
-
array([[ 1.+0.j, 2.+0.j],
-
[ 3.+0.j, 4.+0.j]])
通常,我們無法事先知道數組元素的具體值,但是數組大小是已知的。 這時可以用下面幾種方法生成數組。
zeros 函數生成元素全部爲0的數組,ones函數生成元素全部爲1的數組empty函數生成元素沒有賦值的數組,這時元素值由內存中原來的內容決定。 默認的,生成的數組的元素類型爲float64.
-
>>> zeros( (3,4) )
-
array([[0., 0., 0., 0.],
-
[0., 0., 0., 0.],
-
[0., 0., 0., 0.]])
-
>>> ones( (2,3,4), dtype=int16 )
-
array([[[ 1, 1, 1, 1],
-
[ 1, 1, 1, 1],
-
[ 1, 1, 1, 1]],
-
[[ 1, 1, 1, 1],
-
[ 1, 1, 1, 1],
-
[ 1, 1, 1, 1]]], dtype=int16)
-
>>> empty( (2,3) )
-
array([[ 3.73603959e-262, 6.02658058e-154, 6.55490914e-260],
-
[ 5.30498948e-313, 3.14673309e-307, 1.00000000e+000]])
arange 函數生成的數組的元素按照等比數列排布,類似於 range函數。
-
>>> arange( 10, 30, 5 )
-
array([10, 15, 20, 25])
-
>>> arange( 0, 2, 0.3 )
-
array([ 0. , 0.3, 0.6, 0.9, 1.2, 1.5, 1.8])
linspace 函數有些類似matlab中的同名函數,下面是個例子:
-
>>> linspace( 0, 2, 9 )
-
array([ 0. , 0.25, 0.5 , 0.75, 1. , 1.25, 1.5 , 1.75, 2. ])
-
>>> x = linspace( 0, 2*pi, 100 )
-
>>> f = sin(x)
屏幕輸出 Arrays
當用print 打印一個 array時, 輸出結果類似於 lists:
-
>>> a = arange(6)
-
>>> print a
-
[0 1 2 3 4 5]
-
>>>
-
>>> b = arange(12).reshape(4,3)
-
>>> print b
-
[[ 0 1 2]
-
[ 3 4 5]
-
[ 6 7 8]
-
[ 9 10 11]]
-
>>>
-
>>> c = arange(24).reshape(2,3,4)
-
>>> 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]]]
如果數組過大,顯示時會有一些省略號:
-
>>> print arange(10000)
-
[ 0 1 2 ..., 9997 9998 9999]
-
>>>
-
>>> print arange(10000).reshape(100,100)
-
[[ 0 1 2 ..., 97 98 99]
-
[ 100 101 102 ..., 197 198 199]
-
[ 200 201 202 ..., 297 298 299]
-
...,
-
[9700 9701 9702 ..., 9797 9798 9799]
-
[9800 9801 9802 ..., 9897 9898 9899]
-
[9900 9901 9902 ..., 9997 9998 9999]]
如果我們需要顯示完整的數組,可以如下設置
-
>>> set_printoptions(threshold='nan')
翻譯自官方文檔Tentative NumPy Tutorial,有刪節。
基本操作
基本的算術運算符都可以應用於數組類型,結果爲對應元素之間的運,返回值爲一個新的數組。
-
>>> a = array( [20,30,40,50] )
-
>>> b = 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*sin(a)
-
array([ 9.12945251, -9.88031624, 7.4511316 , -2.62374854])
-
>>> a<35
-
array([True, True, False, False], dtype=bool)</span>
乘法操作符 * 表示的也是元素乘法,如果需要矩陣乘法,可以使用dot函數或者生成一個matrix對象。
-
>>> A = array( [[1,1],
-
... [0,1]] )
-
>>> B = array( [[2,0],
-
... [3,4]] )
-
>>> A*B
-
array([[2, 0],
-
[0, 4]])
-
>>> dot(A,B)
-
array([[5, 4],
-
[3, 4]])
-
>>> a = ones((2,3), dtype=int)
-
>>> b = random.random((2,3))
-
>>> a *= 3
-
>>> a
-
array([[3, 3, 3],
-
[3, 3, 3]])
-
>>> b += a
-
>>> b
-
array([[ 3.69092703, 3.8324276 , 3.0114541 ],
-
[ 3.18679111, 3.3039349 , 3.37600289]])
-
>>> a += b
-
>>> a
-
array([[6, 6, 6],
-
[6, 6, 6]])</span>
當兩個不同元素類型的數組運算時,結果的元素類型爲兩者中更精確的那個。(類型提升)
-
>>> a = ones(3, dtype=int32)
-
>>> b = linspace(0,pi,3)
-
>>> b.dtype.name
-
'float64'
-
>>> c = a+b
-
>>> c
-
array([ 1. , 2.57079633, 4.14159265])
-
>>> c.dtype.name
-
'float64'
-
>>> d = exp(c*1j)
-
>>> d
-
array([ 0.54030231+0.84147098j, -0.84147098+0.54030231j,
-
-0.54030231-0.84147098j])
-
>>> d.dtype.name
-
'complex128'</span>
Array類型提供了許多內置的運算方法,比如。
-
>>> a = random.random((2,3))
-
>>> a
-
array([[ 0.6903007 , 0.39168346, 0.16524769],
-
[ 0.48819875, 0.77188505, 0.94792155]])
-
>>> a.sum()
-
3.4552372100521485
-
>>> a.min()
-
0.16524768654743593
-
>>> a.max()
-
0.9479215542670073</span>
默認情況下, 這些方法作用於整個 array,通過指定 axis,可以使其只作用於某一個 axis :
-
>>> b = arange(12).reshape(3,4)
-
>>> b
-
array([[ 0, 1, 2, 3],
-
[ 4, 5, 6, 7],
-
[ 8, 9, 10, 11]])
-
>>>
-
>>> b.sum(axis=0)
-
array([12, 15, 18, 21])
-
>>>
-
>>> b.min(axis=1)
-
array([0, 4, 8])
-
>>>
-
>>> b.cumsum(axis=1)
-
array([[ 0, 1, 3, 6],
-
[ 4, 9, 15, 22],
-
[ 8, 17, 27, 38]])</span>
常用函數
NumPy 提供了許多常用函數,如sin, cos, and exp. 同樣,這些函數作用於數組中每一個元素,返回另一個數組。
-
>>> B = arange(3)
-
>>> B
-
array([0, 1, 2])
-
>>> exp(B)
-
array([ 1. , 2.71828183, 7.3890561 ])
-
>>> sqrt(B)
-
array([ 0. , 1. , 1.41421356])
-
>>> C = array([2., -1., 4.])
-
>>> add(B, C)
-
array([ 2., 0., 6.])</span>
其他常用函數包括:
all, alltrue, any, apply along axis, argmax, argmin, argsort, average, bincount, ceil, clip, conj, conjugate, corrcoef, cov, cross, cumprod, cumsum, diff, dot, floor, inner, inv, lexsort, max, maximum, mean, median, min, minimum, nonzero, outer, prod, re, round, sometrue, sort, std, sum, trace, transpose, var, vdot, vectorize, where
索引、切片、和迭代
與list類似,數組可以通過下標索引某一個元素,也可以切片,可以用迭代器迭代。
-
>>> a = arange(10)**3
-
>>> a
-
array([ 0, 1, 8, 27, 64, 125, 216, 343, 512, 729])
-
>>> a[2]
-
8
-
>>> a[2:5]
-
array([ 8, 27, 64])
-
>>> a[:6:2] = -1000
-
>>> a
-
array([-1000, 1, -1000, 27, -1000, 125, 216, 343, 512, 729])
-
>>> a[ : :-1]
-
array([ 729, 512, 343, 216, 125, -1000, 27, -1000, 1, -1000])
-
>>> for i in a:
-
... print i**(1/3.),
-
...
-
nan 1.0 nan 3.0 nan 5.0 6.0 7.0 8.0 9.0</span>
多維數組可以用tuple 來索引.
-
>>> def f(x,y):
-
... return 10*x+y
-
...
-
>>> b = fromfunction(f,(5,4),dtype=int)
-
>>> b
-
array([[ 0, 1, 2, 3],
-
[10, 11, 12, 13],
-
[20, 21, 22, 23],
-
[30, 31, 32, 33],
-
[40, 41, 42, 43]])
-
>>> b[2,3]
-
23
-
>>> b[0:5, 1]
-
array([ 1, 11, 21, 31, 41])
-
>>> b[ : ,1]
-
array([ 1, 11, 21, 31, 41])
-
>>> b[1:3, : ]
-
array([[10, 11, 12, 13],
-
[20, 21, 22, 23]])
-
>>> b[-1]
-
array([40, 41, 42, 43])</span>
省略號...表示那些列取完整的值,比如,如果x 的rank = 5,那麼
- x[1,2,...] is equivalent to x[1,2,:,:,:],
- x[...,3] to x[:,:,:,:,3] and
- x[4,...,5,:] to x[4,:,:,5,:].
-
>>> c = array( [ [[ 0, 1, 2],
-
... [ 10, 12, 13]],
-
...
-
... [[100,101,102],
-
... [110,112,113]] ] )
-
>>> c.shape
-
(2, 2, 3)
-
>>> c[1,...]
-
array([[100, 101, 102],
-
[110, 112, 113]])
-
>>> c[...,2]
-
array([[ 2, 13],
-
[102, 113]])
多維數組迭代時以第一個維度爲迭代單位:
-
>>> 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