Numpy 入門教程

轉自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 類型,對一個列的矩陣來說, shape 爲 (n,m)
  • ndarray.size:元素的總數。 
  • Ndarray.dtype:每個元素的類型,可以是 numpy.int32, numpy.int16, and numpy.float64 等。 
  • Ndarray.itemsize:每個元素佔用的字節數。
  • Ndarray.data:指向數據內存。

 

一個簡單的例子:

[python] view plain copy
  1. >>> from numpy  import *  
  2. >>> a = arange(15).reshape(35)  
  3. >>> a  
  4. array([[ 0,  1,  2,  3,  4],  
  5.        [ 5,  6,  7,  8,  9],  
  6.        [1011121314]])  
  7. >>> a.shape  
  8. (35)  
  9. >>> a.ndim  
  10. 2  
  11. >>> a.dtype.name  
  12. 'int32'  
  13. >>> a.itemsize  
  14. 4  
  15. >>> a.size  
  16. 15  
  17. >>> type(a)  
  18. numpy.ndarray  
  19. >>> b = array([678])  
  20. >>> b  
  21. array([678])  
  22. >>> type(b)  
  23. numpy.ndarray  


生成數組

有許多種方法生成數組。比如,可以將Python list 或 tuple 轉化爲數組,轉化後的數組元素的類型由原來的對象的類型來決定。

[python] view plain copy
  1. >>> from numpy  import *  
  2. >>> a = array( [2,3,4] )  
  3. >>> a  
  4. array([234])  
  5. >>> a.dtype  
  6. dtype('int32')  
  7. >>> b = array([1.23.55.1])  
  8. >>> b.dtype  
  9. dtype('float64')  
  10. >>> b = array( [ (1.5,2,3), (4,5,6) ] )  
  11. >>> b  
  12. array([[ 1.5,  2. ,  3. ],  
  13.        [ 4. ,  5. ,  6. ]])  

生成數組時也可以指定元素的數據類型

[python] view plain copy
  1. >>> c = array( [ [1,2], [3,4] ], dtype=complex )  
  2. >>> c  
  3. array([[ 1.+0.j,  2.+0.j],  
  4.        [ 3.+0.j,  4.+0.j]])  

通常,我們無法事先知道數組元素的具體值,但是數組大小是已知的。 這時可以用下面幾種方法生成數組。 

zeros 函數生成元素全部爲0的數組,ones函數生成元素全部爲1的數組empty函數生成元素沒有賦值的數組,這時元素值由內存中原來的內容決定。 默認的,生成的數組的元素類型爲float64.

[python] view plain copy
  1. >>> zeros( (3,4) )  
  2. array([[0.,  0.,  0.,  0.],  
  3.        [0.,  0.,  0.,  0.],  
  4.        [0.,  0.,  0.,  0.]])  
  5. >>> ones( (2,3,4), dtype=int16 )                # dtype can also be specified  
  6. array([[[ 1111],  
  7.         [ 1111],  
  8.         [ 1111]],  
  9.        [[ 1111],  
  10.         [ 1111],  
  11.         [ 1111]]], dtype=int16)  
  12. >>> empty( (2,3) )  
  13. array([[  3.73603959e-262,   6.02658058e-154,   6.55490914e-260],  
  14.        [  5.30498948e-313,   3.14673309e-307,   1.00000000e+000]])  

arange 函數生成的數組的元素按照等比數列排布,類似於 range函數。

[python] view plain copy
  1. >>> arange( 10305 )  
  2. array([10152025])  
  3. >>> arange( 020.3 )                 # it accepts float arguments  
  4. array([ 0. ,  0.3,  0.6,  0.9,  1.2,  1.5,  1.8])  

linspace 函數有些類似matlab中的同名函數,下面是個例子

[python] view plain copy
  1. >>> linspace( 029 )                 # 9 numbers from 0 to 2  
  2. array([ 0.  ,  0.25,  0.5 ,  0.75,  1.  ,  1.25,  1.5 ,  1.75,  2.  ])  
  3. >>> x = linspace( 02*pi, 100 )        # useful to evaluate function at lots of points  
  4. >>> f = sin(x)  

屏幕輸出 Arrays

當用print 打印一個 array輸出結果類似於 lists: 

[python] view plain copy
  1. >>> a = arange(6)                         # 1d array  
  2. >>> print a  
  3. [0 1 2 3 4 5]  
  4. >>>  
  5. >>> b = arange(12).reshape(4,3)           # 2d array  
  6. >>> print b  
  7. [[ 0  1  2]  
  8.  [ 3  4  5]  
  9.  [ 6  7  8]  
  10.  [ 9 10 11]]  
  11. >>>  
  12. >>> c = arange(24).reshape(2,3,4)         # 3d array  
  13. >>> print c  
  14. [[[ 0  1  2  3]  
  15.   [ 4  5  6  7]  
  16.   [ 8  9 10 11]]  
  17.   
  18.  [[12 13 14 15]  
  19.   [16 17 18 19]  
  20.   [20 21 22 23]]]  

如果數組過大,顯示時會有一些省略號

[python] view plain copy
  1. >>> print arange(10000)  
  2. [   0    1    2 ..., 9997 9998 9999]  
  3. >>>  
  4. >>> print arange(10000).reshape(100,100)  
  5. [[   0    1    2 ...,   97   98   99]  
  6.  [ 100  101  102 ...,  197  198  199]  
  7.  [ 200  201  202 ...,  297  298  299]  
  8.  ...,  
  9.  [9700 9701 9702 ..., 9797 9798 9799]  
  10.  [9800 9801 9802 ..., 9897 9898 9899]  
  11.  [9900 9901 9902 ..., 9997 9998 9999]]  

如果我們需要顯示完整的數組,可以如下設置 

[python] view plain copy
  1. >>> set_printoptions(threshold='nan')  

翻譯自官方文檔Tentative NumPy Tutorial,有刪節。

基本操作

基本的算術運算符都可以應用於數組類型,結果爲對應元素之間的運,返回值爲一個新的數組。

[python] view plain copy
  1. >>> a = array( [20,30,40,50] )  
  2. >>> b = arange( 4 )  
  3. >>> b  
  4. array([0123])  
  5. >>> c = a-b  
  6. >>> c  
  7. array([20293847])  
  8. >>> b**2  
  9. array([0149])  
  10. >>> 10*sin(a)  
  11. array([ 9.12945251, -9.88031624,  7.4511316 , -2.62374854])  
  12. >>> a<35  
  13. array([TrueTrueFalseFalse], dtype=bool)</span>  

乘法操作符 表示的也是元素乘法,如果需要矩陣乘法,可以使用dot函數或者生成一個matrix對象。 

[python] view plain copy
  1. >>> A = array( [[1,1],  
  2. ...             [0,1]] )  
  3. >>> B = array( [[2,0],  
  4. ...             [3,4]] )  
  5. >>> A*B                         # elementwise product  
  6. array([[20],  
  7.        [04]])  
  8. >>> dot(A,B)                    # matrix product  
  9. array([[54],  
  10.        [34]])  
  11. >>> a = ones((2,3), dtype=int)  
  12. >>> b = random.random((2,3))  
  13. >>> a *= 3  
  14. >>> a  
  15. array([[333],  
  16.        [333]])  
  17. >>> b += a  
  18. >>> b  
  19. array([[ 3.69092703,  3.8324276 ,  3.0114541 ],  
  20.        [ 3.18679111,  3.3039349 ,  3.37600289]])  
  21. >>> a += b                                  # b is converted to integer type  
  22. >>> a  
  23. array([[666],  
  24.        [666]])</span>  

當兩個不同元素類型的數組運算時,結果的元素類型爲兩者中更精確的那個。(類型提升)

[python] view plain copy
  1. >>> a = ones(3, dtype=int32)  
  2. >>> b = linspace(0,pi,3)  
  3. >>> b.dtype.name  
  4. 'float64'  
  5. >>> c = a+b  
  6. >>> c  
  7. array([ 1.        ,  2.57079633,  4.14159265])  
  8. >>> c.dtype.name  
  9. 'float64'  
  10. >>> d = exp(c*1j)  
  11. >>> d  
  12. array([ 0.54030231+0.84147098j, -0.84147098+0.54030231j,  
  13.        -0.54030231-0.84147098j])  
  14. >>> d.dtype.name  
  15. 'complex128'</span>  

Array類型提供了許多內置的運算方法,比如。

[python] view plain copy
  1. >>> a = random.random((2,3))  
  2. >>> a  
  3. array([[ 0.6903007 ,  0.39168346,  0.16524769],  
  4.        [ 0.48819875,  0.77188505,  0.94792155]])  
  5. >>> a.sum()  
  6. 3.4552372100521485  
  7. >>> a.min()  
  8. 0.16524768654743593  
  9. >>> a.max()  
  10. 0.9479215542670073</span>  

默認情況下, 這些方法作用於整個 array,通過指定 axis,可以使其只作用於某一個 axis : 

[python] view plain copy
  1. >>> b = arange(12).reshape(3,4)  
  2. >>> b  
  3. array([[ 0,  1,  2,  3],  
  4.        [ 4,  5,  6,  7],  
  5.        [ 8,  91011]])  
  6. >>>  
  7. >>> b.sum(axis=0)                            # sum of each column  
  8. array([12151821])  
  9. >>>  
  10. >>> b.min(axis=1)                            # min of each row  
  11. array([048])  
  12. >>>  
  13. >>> b.cumsum(axis=1)                         # cumulative sum along each row  
  14. array([[ 0,  1,  3,  6],  
  15.        [ 4,  91522],  
  16.        [ 8172738]])</span>  

常用函數

NumPy 提供了許多常用函數,如sin, cos, and exp. 同樣,這些函數作用於數組中每一個元素,返回另一個數組。

[python] view plain copy
  1. >>> B = arange(3)  
  2. >>> B  
  3. array([012])  
  4. >>> exp(B)  
  5. array([ 1.        ,  2.71828183,  7.3890561 ])  
  6. >>> sqrt(B)  
  7. array([ 0.        ,  1.        ,  1.41421356])  
  8. >>> C = array([2., -1.4.])  
  9. >>> add(B, C)  
  10. array([ 2.,  0.,  6.])</span>  

其他常用函數包括:

allalltrueanyapply along axisargmaxargminargsortaveragebincountceilclipconjconjugatecorrcoefcovcrosscumprodcumsumdiffdotfloorinnerinvlexsortmaxmaximummeanmedianminminimumnonzeroouterprodreroundsometruesortstdsumtracetransposevarvdotvectorizewhere


索引、切片、和迭代

list類似,數組可以通過下標索引某一個元素,也可以切片,可以用迭代器迭代。

[python] view plain copy
  1. >>> a = arange(10)**3  
  2. >>> a  
  3. array([  0,   1,   8,  27,  64125216343512729])  
  4. >>> a[2]  
  5. 8  
  6. >>> a[2:5]  
  7. array([ 82764])  
  8. >>> a[:6:2] = -1000    # equivalent to a[0:6:2] = -1000; from start to position 6, exclusive, set every 2nd element to -1000  
  9. >>> a  
  10. array([-1000,     1, -1000,    27, -1000,   125,   216,   343,   512,   729])  
  11. >>> a[ : :-1]                                 # reversed a  
  12. array([  729,   512,   343,   216,   125, -1000,    27, -1000,     1, -1000])  
  13. >>> for i in a:  
  14. ...         print i**(1/3.),  
  15. ...  
  16. nan 1.0 nan 3.0 nan 5.0 6.0 7.0 8.0 9.0</span>  

多維數組可以用tuple 來索引.  

[python] view plain copy
  1. >>> def f(x,y):  
  2. ...         return 10*x+y  
  3. ...  
  4. >>> b = fromfunction(f,(5,4),dtype=int)  
  5. >>> b  
  6. array([[ 0,  1,  2,  3],  
  7.        [10111213],  
  8.        [20212223],  
  9.        [30313233],  
  10.        [40414243]])  
  11. >>> b[2,3]  
  12. 23  
  13. >>> b[0:51]                       # each row in the second column of b  
  14. array([ 111213141])  
  15. >>> b[ : ,1]                        # equivalent to the previous example  
  16. array([ 111213141])  
  17. >>> b[1:3, : ]                      # each column in the second and third row of b  
  18. array([[10111213],  
  19.        [20212223]])  
  20. >>> b[-1]                                  # the last row. Equivalent to b[-1,:]  
  21. array([40414243])</span>  

省略號...表示那些列取完整的值,比如,如果rank = 5,那麼 

  •  x[1,2,...] is equivalent to x[1,2,:,:,:], 
  •  x[...,3] to x[:,:,:,:,3] and 
  •  x[4,...,5,:] to x[4,:,:,5,:].

[python] view plain copy
  1. >>> c = array( [ [[  0,  1,  2],               # a 3D array (two stacked 2D arrays)  
  2. ...               [ 101213]],  
  3. ...  
  4. ...              [[100,101,102],  
  5. ...               [110,112,113]] ] )  
  6. >>> c.shape  
  7. (223)  
  8. >>> c[1,...]                                   # same as c[1,:,:] or c[1]  
  9. array([[100101102],  
  10.        [110112113]])  
  11. >>> c[...,2]                                   # same as c[:,:,2]  
  12. array([[  2,  13],  
  13.        [102113]])  

多維數組迭代時以第一個維度爲迭代單位

[python] view plain copy
  1. >>> for row in b:  
  2. ...         print row  
  3. ...  
  4. [0 1 2 3]  
  5. [10 11 12 13]  
  6. [20 21 22 23]  
  7. [30 31 32 33]  
  8. [40 41 42 43]  

如果我們想忽略維度,將多維數組當做一個大的一維數組也是可以的,下面是例子

[python] view plain copy
  1. >>> for element in b.flat:  
  2. ...         print element,  
  3. ...  
  4. 0 1 2 3 10 11 12 13 20 21 22 23 30 31 32 33 40 41 42 43  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章