Numpy基本教程

Numpy基本知識

NumPy是Python中科學計算的基礎包。它是一個Python庫,提供多維數組對象,各種派生對象(如掩碼數組和矩陣),以及用於數組快速操作的各種API,有包括數學、邏輯、形狀操作、排序、選擇、輸入輸出、離散傅立葉變換、基本線性代數,基本統計運算和隨機模擬等等。NumPy包的核心是 ndarray 對象。它封裝了python原生的同數據類型的 n 維數組,爲了保證其性能優良,其中有許多操作都是代碼在本地進行編譯後執行的。

NumPy數組 和 原生Python Array(數組)之間有幾個重要的區別:

NumPy 數組在創建時具有固定的大小,與Python的原生數組對象(可以動態增長)不同。更改ndarray的大小將創建一個新數組並刪除原來的數組。 NumPy 數組中的元素都需要具有相同的數據類型,因此在內存中的大小相同。 例外情況:Python的原生數組裏包含了NumPy的對象的時候,這種情況下就允許不同大小元素的數組。 NumPy 數組有助於對大量數據進行高級數學和其他類型的操作。通常,這些操作的執行效率更高,比使用Python原生數組的代碼更少。
越來越多的基於Python的科學和數學軟件包使用NumPy數組;
雖然這些工具通常都支持Python的原生數組作爲參數,但它們在處理之前會還是會將輸入的數組轉換爲NumPy的數組,而且也通常輸出爲NumPy數組。換句話說,爲了高效地使用當今科學/數學基於Python的工具(大部分的科學計算工具),你只知道如何使用Python的原生數組類型是不夠的

Numpy基本知識

NumPy是Python中科學計算的基礎包。它是一個Python庫,提供多維數組對象,各種派生對象(如掩碼數組和矩陣),以及用於數組快速操作的各種API,有包括數學、邏輯、形狀操作、排序、選擇、輸入輸出、離散傅立葉變換、基本線性代數,基本統計運算和隨機模擬等等。NumPy包的核心是 ndarray 對象。它封裝了python原生的同數據類型的 n 維數組,爲了保證其性能優良,其中有許多操作都是代碼在本地進行編譯後執行的。

NumPy數組 和 原生Python Array(數組)之間有幾個重要的區別:

NumPy 數組在創建時具有固定的大小,與Python的原生數組對象(可以動態增長)不同。更改ndarray的大小將創建一個新數組並刪除原來的數組。 NumPy 數組中的元素都需要具有相同的數據類型,因此在內存中的大小相同。 例外情況:Python的原生數組裏包含了NumPy的對象的時候,這種情況下就允許不同大小元素的數組。 NumPy 數組有助於對大量數據進行高級數學和其他類型的操作。通常,這些操作的執行效率更高,比使用Python原生數組的代碼更少。
越來越多的基於Python的科學和數學軟件包使用NumPy數組;
雖然這些工具通常都支持Python的原生數組作爲參數,但它們在處理之前會還是會將輸入的數組轉換爲NumPy的數組,而且也通常輸出爲NumPy數組。換句話說,爲了高效地使用當今科學/數學基於Python的工具(大部分的科學計算工具),你只知道如何使用Python的原生數組類型是不夠的

NumPy的數組類被調用ndarray。它也被別名所知 array。請注意,numpy.array這與標準Python庫類不同array.array,後者只處理一維數組並提供較少的功能。ndarray對象更重要的屬性是:

  1. ndarray.ndim - 數組的軸(維度)的個數。在Python世界中,維度的數量被稱爲rank。
  2. ndarray.shape - 數組的維度。這是一個整數的元組,表示每個維度中數組的大小。對於有 n 行和 m 列的矩陣,shape
    將是 (n,m)。因此,shape 元組的長度就是rank或維度的個數 ndim。
  3. ndarray.size - 數組元素的總數。這等於 shape 的元素的乘積。
  4. ndarray.dtype - 一個描述數組中元素類型的對象。可以使用標準的Python類型創建或指定dtype。另外NumPy提供它自己的類型。例如numpy.int32、numpy.int16和numpy.float64。
  5. ndarray.itemsize - 數組中每個元素的字節大小。例如,元素爲 float64 類型的數組的 itemsize 爲8(=64/8),而 complex32 類型的數組的 itemsize 爲4(=32/8)。它等於 ndarray.dtype.itemsize 。
  6. 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'>

數組創建

(1)可以使用array函數從常規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')
array 還可以將序列的序列轉換成二維數組,將序列
的序列的序列轉換成三維數組,等等
>>>c = np.array([(1.5,2,3), (4,5,6)])
>>> c
array([[ 1.5,  2. ,  3. ],
       [ 4. ,  5. ,  6. ]])

(2) 函數zeros創建一個由0組成的數組,函數 ones創建一個完整的數組,函數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]])

(3) 爲了創建數字組成的數組,NumPy提供了一個類似於range的函數—arrange,該函數返回數組而不是列表。

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

數組運算&操作

a = np.random.randint(10, size=20).reshape(4, 5)
b = np.random.randint(10, size=20).reshape(4, 5)
加減乘除:a+b,a-b,a*b,a/b

某些操作(例如+=和 *=)會更直接更改被操作的矩陣數組而不會創建新矩陣數組。

>>> a = np.ones((2,3), dtype=int)
>>> b = np.random.random((2,3))
>>> a *= 3
>>> a
array([[3, 3, 3],
       [3, 3, 3]])
>>> b += a
>>> b
array([[ 3.417022  ,  3.72032449,  3.00011437],
       [ 3.30233257,  3.14675589,  3.09233859]])

NumPy提供熟悉的數學函數,例如sin,cos和exp。在NumPy中,這些被稱爲“通函數”(ufunc)。在NumPy中,這些函數在數組上按元素進行運算,產生一個數組作爲輸出。

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

對元素的操作:Array常用函數

a = np.random.randint(10, size=20).reshape(4, 5)
np.unique(a)
array([0, 1, 2, 3, 4, 5, 6, 8, 9])
a
array([[4, 1, 2, 5, 3],
       [9, 8, 1, 4, 0],
       [5, 4, 8, 0, 2],
       [8, 6, 2, 4, 3]])
sum(a)
array([26, 19, 13, 13,  8])
sum(a[0])
15
sum(a[:,0])
26
a.max()
9
max(a[0])
5
max(a[:,0])
9

pickle讀取numpy序列化

import pickle
import numpy as np
x = np.arange(10)
x
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
f = open('x2.pkl', 'wb')
pickle.dump(x, f)
f = open('x2.pkl', 'rb')
pickle.load(f)
...array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
np.save('one_array', x)

Reference
Numpy教程
github numpy教程

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