翻譯自官方文檔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 # elementwise product
array([[2, 0],[0, 4]])
>>> dot(A,B) # matrix product
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 # b is converted to integer type
>>> 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) # sum of each column
array([12, 15, 18, 21])
>>>
>>> b.min(axis=1) # min of each row
array([0, 4, 8])
>>>
>>> b.cumsum(axis=1) # cumulative sum along each row
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 # equivalent to a[0:6:2] = -1000; from start to position 6, exclusive, set every 2nd element to -1000
>>> a
array([-1000, 1, -1000, 27, -1000, 125, 216, 343, 512, 729])
>>> a[ : :-1] # reversed a
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] # each row in the second column of b
array([ 1, 11, 21, 31, 41])
>>> b[ : ,1] # equivalent to the previous example
array([ 1, 11, 21, 31, 41])
>>> b[1:3, : ] # each column in the second and third row of b
array([[10, 11, 12, 13],[20, 21, 22, 23]])
>>> b[-1] # the last row. Equivalent to 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], # a 3D array (two stacked 2D arrays)
... [ 10, 12, 13]],
...
... [[100,101,102],
... [110,112,113]] ] )
>>> c.shape
(2, 2, 3)
>>> c[1,...] # same as c[1,:,:] or c[1]
array([[100, 101, 102],[110, 112, 113]])
>>> c[...,2] # same as 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