1. 程式人生 > >【numpy官方快速入門教程】

【numpy官方快速入門教程】

寫在前面:

1、本文是NumPy官方網站(http://www.numpy.org/)的快速入門教程(Quickstart tutorial)的完整翻譯版本,原文地址是https://docs.scipy.org/doc/numpy/user/quickstart.html。適合新手上路。
2、原文程式碼使用python自帶的IDE(IDLE)作為編輯器,但不利於程式碼整體複製貼上,故作者除了貼出原文程式碼,還基於pycharm整合出了整體程式碼,使得看起來更方便,且符合PEP8標準。

—————————————–正文開始!

——————————————-

快速入門教程

預備知識

在閱讀本教程之前,您應該瞭解一些Python。如果您想要重新整理您的記憶,請檢視Python教程
如果您希望在本教程中使用示例,您還必須在計算機上安裝一些軟體。請參閱http://scipy.org/install.html以獲得指示。

基礎部分

NumPy的主要物件是同構多維陣列(homogeneous multidimensional array),它是由同一型別元素組成的表(通常是數字)並由一個正整數元組索引。在NumPy中,維度(dimensions)稱為軸(axes)。
舉例來說,在3D空間中的一個點的座標[1, 2, 1]

有1個軸。該軸有3個元素,所以我們說這個軸的長度是3。下面的例子中,陣列有2個軸。第一個軸長度為2,第二個軸長度為3。

[[ 1., 0., 0.],
 [ 0., 1., 2.]]

NumPy的陣列類(array class)稱為ndarray。它還有個別名array。要注意的是,numpy.array和python標準庫的array.array類不同,後者只能處理1維素組,並且功能較少。ndarray物件的重要屬性有:
ndarray.ndim
  陣列的軸(維)數。

ndarray.shape
  陣列的維度。它是一個表示每個維度尺寸的整數元組。對於一個n行m列的矩陣(matrix),shape

(n,m)shape元組的長度也即是軸數,ndim

ndarray.size
  陣列的元素總數。它等於shape中的每個元素的乘積。

ndarray.dtype
  描述陣列中元素型別的物件。可以使用標準Python型別建立或指定dtype。另外,NumPy提供了它自己的型別,如numpy.int32、numpy.int16 、numpy、float64等。

ndarray.itemsize
  陣列中每個元素的位元組數。例如,一個元素型別為float64的陣列的itemsize為8(=64/8),元素型別為comples32的陣列的itemsize為4(=32/8)。
它還等於ndarray.dtype.itemsize

ndarray.data
  包含陣列的實際元素的緩衝區。通常,我們不需要使用這個屬性,因為我們將使用索引工具訪問陣列中的元素。

一些例子
官網原始碼:

>>> 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.itemsize
8
>>> a.size
15
>>> type(a)
<type 'numpy.ndarray'>
>>> b = np.array([6, 7, 8])
>>> b
array([6, 7, 8])
>>> type(b)
<type 'numpy.ndarray'>

pycharm程式碼:

import numpy as np
a = np.arange(15).reshape(3, 5)
print('a is:\n', a)
print('--------------------')
print('a.shape is:     ', a.shape)
print('--------------------')
print('a.ndim is:      ', a.ndim)
print('--------------------')
print('a.dtype.name is:', a.dtype.name)
print('--------------------')
print('a.itemsize is:  ', a.itemsize)
print('--------------------')
print('a.size is:      ', a.size)
print('--------------------')
print('type(a) is:     ', type(a))
print('--------------------')
b = np.array([6, 7, 8])
print('b is:\n', b)
print('--------------------')
print('type(b) is:     ', type(b))

輸出結果

a is:
 [[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]]
--------------------
a.shape is:      (3, 5)
--------------------
a.ndim is:       2
--------------------
a.dtype.name is: int32
--------------------
a.itemsize is:   4
--------------------
a.size is:       15
--------------------
type(a) is:      <class 'numpy.ndarray'>
--------------------
b is:
 [6 7 8]
--------------------
type(b) is:      <class 'numpy.ndarray'>

生成陣列

有多種途徑生成陣列。

例如,您可以使用陣列函式(array function)從常規的Python列表或元組中建立。生成的陣列型別由序列(即,列表或元組。譯者注)中元素的型別推斷出來。
官網程式碼:

>>> import numpy as np
>>> a = np.array([2,3,4])
>>> a
array([2, 3, 4])
>>> a.dtype
dtype('int64')
>>> b = np.array([1.2, 3.5, 5.1])
>>> b.dtype
dtype('float64')

pycharm程式碼:

import numpy as np
a = np.array([2, 3, 4])
print(a)
print(a.dtype)
b = np.array([1.2, 3.5, 5.1])
print(b.dtype)

結果:

[2 3 4]
int32
float64

呼叫array時應該以列表形式提供給array單一引數。有個常見的錯誤,就是用多個數字直接作為array的引數。

>>> a = np.array(1,2,3,4)    # WRONG
>>> a = np.array([1,2,3,4])  # RIGHT

array把序列的序列轉化成2維的陣列,把序列的序列的序列轉化為3維的陣列,以此類推
官方程式碼:

>>> b = np.array([(1.5,2,3), (4,5,6)])
>>> b
array([[ 1.5,  2. ,  3. ],
       [ 4. ,  5. ,  6. ]])

pycharm程式碼:

import numpy as np
b = np.array([(1.5, 2, 3), (4, 5, 6)])
print(b)

結果:

[[1.5 2.  3. ]
 [4.  5.  6. ]]

可以在建立陣列時顯式地指定資料型別:
官方程式碼:

>>> c = np.array( [ [1,2], [3,4] ], dtype=complex )
>>> c
array([[ 1.+0.j,  2.+0.j],
       [ 3.+0.j,  4.+0.j]])

pycharm程式碼:

import numpy as np
c = np.array([[1, 2], [3, 4]], dtype=complex)
print(c)
[[1.+0.j 2.+0.j]
 [3.+0.j 4.+0.j]]

通常來說,陣列元素最初是未知的,但尺寸是已知的。因此,NumPy提供了幾個函式來建立帶有初始佔位符內容的陣列。這些函式最小化了增大陣列尺寸這種操作成本極高的需求。

函式zeros建立了一個全0的陣列,函式ones建立了一個全1陣列,而函式empty建立了一個初始內容是隨機,依賴於記憶體的狀態的陣列(元素值都是極小的數字。譯者注)。預設情況下,建立的陣列的dtype是float64
官方程式碼:

>>> np.zeros( (3,4) )
array([[ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.]])
>>> np.ones( (2,3,4), dtype=np.int16 )                # dtype can also be specified
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)
>>> np.empty( (2,3) )                                 # uninitialized, output may vary
array([[  3.73603959e-262,   6.02658058e-154,   6.55490914e-260],
       [  5.30498948e-313,   3.14673309e-307,   1.00000000e+000]])

pycharm程式碼:

import numpy as np
eg1 = np.zeros((3, 4))
print(eg1)
print('--------------------')
eg2 = np.ones((2, 3, 4), dtype=np.int16)
print(eg2)
print('--------------------')
eg3 = np.empty((2, 3))
print(eg3)
[[0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]]
--------------------
[[[1 1 1 1]
  [1 1 1 1]
  [1 1 1 1]]

 [[1 1 1 1]
  [1 1 1 1]
  [1 1 1 1]]]
--------------------
[[1.60216183e-306 7.56602523e-307 1.11258446e-306]
 [6.23059726e-307 6.23060065e-307 1.50200974e-307]]

為了建立數字序列,NumPy提供了一個類似於range這種返回陣列而不是列表的函式。
官方程式碼:

>>> np.arange( 10, 30, 5 )
array([10, 15, 20, 25])
>>> np.arange( 0, 2, 0.3 )                 # it accepts float arguments
array([ 0. ,  0.3,  0.6,  0.9,  1.2,  1.5,  1.8])

pycharm程式碼:

import numpy as np
eg1 = np.arange(10, 30, 5)
print(eg1)
print(type(eg1))
eg2 = np.arange(0, 2, 0.3)
print(eg2)
print(type(eg2))
[10 15 20 25]
<class 'numpy.ndarray'>
[0.  0.3 0.6 0.9 1.2 1.5 1.8]
<class 'numpy.ndarray'>

arange的引數為浮點數時,因為浮點數精度有限,不太可能預測元素的數量。因此,使用linspace會比較好,linspace接收元素數量的引數。
官方程式碼:

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

pycharm程式碼:

import numpy as np
eg1 = np.linspace(0, 2, 9)
print(eg1)
print('--------------------------------')
x = np.linspace(0, 2*np.pi, 10)  # 原文要100個數,太多了,簡化到10個
print(x)
print('--------------------------------')
f = np.sin(x)
print(f)
[0.   0.25 0.5  0.75 1.   1.25 1.5  1.75 2.  ]
----------------------
[0.         0.6981317  1.3962634  2.0943951  2.7925268  3.4906585
 4.1887902  4.88692191 5.58505361 6.28318531]
----------------------
[ 0.00000000e+00  6.42787610e-01  9.84807753e-01  8.66025404e-01
  3.42020143e-01 -3.42020143e-01 -8.66025404e-01 -9.84807753e-01
 -6.42787610e-01 -2.44929360e-16]

列印陣列

當您列印一個數組時,NumPy以類似於巢狀列表的方式顯示它,但是使用以下佈局:

  最後一個軸從左到右列印,
  倒數第二個軸從上到下列印,
  其餘的部分也從上到下列印,每一塊都由一條空的線隔開。

然後將一維陣列列印為行,二維陣列列印為矩陣,三維陣列列印為矩陣列表。
官方原始碼:

>>> a = np.arange(6)                         # 1d array
>>> print(a)
[0 1 2 3 4 5]
>>>
>>> b = np.arange(12).reshape(4,3)           # 2d array
>>> print(b)
[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]]
>>>
>>> c = np.arange(24).reshape(2,3,4)         # 3d array
>>> 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]]]

pycharm程式碼:

import numpy as np

a = np.arange(6)
print('a:\n', a)
print('-----------------------')
b = np.arange(12).reshape(4, 3)
print('b:\n', b)
print('-----------------------')
c = np.arange(24).reshape(2, 3, 4)
print('c:\n', c)
a:
 [0 1 2 3 4 5]
-----------------------
b:
 [[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]]
-----------------------
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]]]

看下面的內容以獲得關於reshape的詳情。
如果陣列太大而無法列印,NumPy會自動跳過陣列的中心部分,只打印邊角:
官方原始碼:

>>> print(np.arange(10000))
[   0    1    2 ..., 9997 9998 9999]
>>>
>>> print(np.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]]

pycharm程式碼:

import numpy as np

print(np.arange(10000))
print('-------------------------------------------')
print(np.arange(10000).reshape(100,100))
[   0    1    2 ... 9997 9998 9999]
-------------------------------------------
[[   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]]

要禁用這種行為並強制NumPy列印整個陣列,可以使用set_printoptions更改列印選項。
官方原始碼:

>>> np.set_printoptions(threshold=np.nan)

pycharm程式碼:

import numpy as np

print(np.arange(1001))
np.set_printoptions(threshold=np.nan)
print('---------------------------set to print all-------------------------------')
print(np.arange(1001))
[   0    1    2 ...  998  999 1000]
---------------------------set to print all-------------------------------
[   0    1    2    3    4    5    6    7    8    9   10   11   12   13
   14   15   16   17   18   19   20   21   22   23   24   25   26   27
   28   29   30   31   32   33   34   35   36   37   38   39   40   41
   42   43   44   45   46   47   48   49   50   51   52   53   54   55
   56   57   58   59   60   61   62   63   64   65   66   67   68   69
   70   71   72   73   74   75   76   77   78   79   80   81   82   83
   84   85   86   87   88   89   90   91   92   93   94   95   96   97
   98   99  100  101  102  103  104  105  106  107  108  109  110  111
  112  113  114  115  116  117  118  119  120  121  122  123  124  125
  126  127  128  129  130  131  132  133  134  135  136  137  138  139
  140  141  142  143  144  145  146  147  148  149  150  151  152  153
  154  155  156  157  158  159  160  161  162  163  164  165  166  167
  168  169  170  171  172  173  174  175  176  177  178  179  180  181
  182  183  184  185  186  187  188  189  190  191  192  193  194  195
  196  197  198  199  200  201  202  203  204  205  206  207  208  209
  210  211  212  213  214  215  216  217  218  219  220  221  222  223
  224  225  226  227  228  229  230  231  232  233  234  235  236  237
  238  239  240  241  242  243  244  245  246  247  248  249  250  251
  252  253  254  255  256  257  258  259  260  261  262  263  264  265
  266  267  268  269  270  271  272  273  274  275  276  277  278  279
  280  281  282  283  284  285  286  287  288  289  290  291  292  293
  294  295  296  297  298  299  300  301  302  303  304  305  306  307
  308  309  310  311  312  313  314  315  316  317  318  319  320  321
  322  323  324  325  326  327  328  329  330  331  332  333  334  335
  336  337  338  339  340  341  342  343  344  345  346  347  348  349
  350  351  352  353  354  355  356  357  358  359  360  361  362  363
  364  365  366  367  368  369  370  371  372  373  374  375  376  377
  378  379  380  381  382  383  384  385  386  387  388  389  390  391
  392  393  394  395  396  397  398  399  400  401  402  403  404  405
  406  407  408  409  410  411  412  413  414  415  416  417  418  419
  420  421  422  423  424  425  426  427  428  429  430  431  432  433
  434  435  436  437  438  439  440  441  442  443  444  445  446  447
  448  449  450  451  452  453  454  455  456  457  458  459  460  461
  462  463  464  465  466  467  468  469  470  471  472  473  474  475
  476  477  478  479  480  481  482  483  484  485  486  487  488  489
  490  491  492  493  494  495  496  497  498  499  500  501  502  503
  504  505  506  507  508  509  510  511  512  513  514  515  516  517
  518  519  520  521  522  523  524  525  526  527  528  529  530  531
  532  533  534  535  536  537  538  539  540  541  542  543  544  545
  546  547  548  549  550  551  552  553  554  555  556  557  558  559
  560  561  562  563  564  565  566  567  568  569  570  571  572  573
  574  575  576  577  578  579  580  581  582  583  584  585  586  587
  588  589  590  591  592  593  594  595  596  597  598  599  600  601
  602  603  604  605  606  607  608  609  610  611  612  613  614  615
  616  617  618  619  620  621  622  623  624  625  626  627  628  629
  630  631  632  633  634  635  636  637  638  639  640  641  642  643
  644  645  646  647  648  649  650  651  652  653  654  655  656  657
  658  659  660  661  662  663  664  665  666  667  668  669  670  671
  672  673  674  675  676  677  678  679  680  681  682  683  684  685
  686  687  688  689  690  691  692  693  694  695  696  697  698  699
  700  701  702  703  704  705  706  707  708  709  710