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