先決條件
熟悉python,可以參考Python Tutorial或者廖雪峯的官方網站
安裝Python和Numpy
建議安裝ipython或bpython(推薦),一個強化版本的Python Shell,學習時非常方便.
後續的代碼均在python3中測試通過。
基礎篇
Numpy的主要對象是同種元素的多維數組,這和Python的列表稍微不同,Python列表的元素類型可以不同。在Numpy中,維度(dimensions)叫做軸(axes),軸的個數叫做秩(rank),比如:
[1, 2, 3]
是一個秩爲1 的數組,軸長度爲3;
[[1., 0., 0.],
[0., 1., 2.]]
數組的秩爲2,第一維的維度爲2,第二維維度爲3.
常用屬性
Numpy的數組類被稱作ndarray,常稱爲數組,ndarray的一些常用屬性有:
ndarray.ndim
返回數組的秩,即數組軸的個數。
ndarray.shape
返回一個元組,該元組包含數組的維度,指示數組在每一維上的維度大小。
ndarray.size
返回數組中的元素個數,等於shape屬性返回的元祖中元素的乘積。
ndarray.dtype
返回數組中元素的類型。
ndarray.itemsize
返回數組每個元素的字節大小
通常我們在程序中導入numpy包的方法如下:
import numpy as np
後續例子都默認使用以上語句導入了numpy。
例子
>>> 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
dtype('int64')
>> a.dtype.name
'int64'
>>> a.itemsize
8
>>> a.size
15
>>> type(a)
<class 'numpy.ndarray'>
>>> b = np.array([1, 2, 3])
>>> b
array([1, 2, 3])
>>> type(b)
<class 'numpy.ndarray'>
以上例子中的arange(), reshape(), array()函數將在後續進行講解,請按照以上代碼進行測試。
創建數組
使用np.array()函數來利用常規的Python列表和元組創建數組,數組元素類型根據原序列的元素來推導
>>> a = np.array([2, 3, 4]) >>> a array([2, 3, 4]) >>> a.dtype dtype('int64') >>> b = np.array([1.1, 1.2, 1.3]) >>> b.dtype dtype('float64') >>> c = np.array([[1, 2, 3], [4, 5, 6]])# 創建二維數組 >>> c array([[1, 2, 3], [4, 5, 6]]) >>> c.dtype dtype('int64') >>> d = np.array([[1, 2, 3], [4, 5, 6]], dtype=np.float32) # 爲數組指定元素類型 >>> d array([[ 1., 2., 3.], [ 4., 5., 6.]], dtype=float32) >>> d.dtype dtype('float32')
numpy中有一些方便的創建常見數組的函數,比如np.ones()創建全爲1的數組,npp.zeros創建全爲0的數組,np.empty()創建內容隨機。這些函數創建的數組元素類型默認爲np.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.float32) 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=float32) >>> np.empty((2, 3)) array([[ 0.00000000e+000, 4.94065646e-324, 9.88131292e-324], [ 1.48219694e-323, 1.97626258e-323, 2.47032823e-323]])
注意:使用這幾個函數創建數組時,需指定數組形狀,一元祖形式作爲參數,而不是每一個維度單獨作爲參數,例如,創建一個2 × 3的數組,np.zeros((2, 3)).
numpy中有一個類似 python 中range() 的函數,np.arange(),作用和用法和range()一樣,區別是返回一個數組,而不是列表
>>> np.arange(0, 10) array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> np.arange(0, 10, 2) array([0, 2, 4, 6, 8])
np.linspace(start, end, num),將一個區間進行平分,結束節點end將包括在內, 這和np.arange()有點不同, 默認平分爲50個數:
>>> np.linspace(0, 10, 10) array([ 0. , 1.11111111, 2.22222222, 3.33333333, 4.44444444, 5.55555556, 6.66666667, 7.77777778, 8.88888889, 10. ]) >>> np.linspace(0, 9, 10) array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])
基本運算
numpy支持所有的算術運算,但都是按元素進行的(elementwise):
>>> a = np.array([1, 2, 3, 4]) >>> b = np.array([5, 6, 7, 8]) >>> c = b - a >>> c array([4, 4, 4, 4]) >>> a ** 2 array([ 1, 4, 9, 16]) >>> np.sin(a) array([ 0.84147098, 0.90929743, 0.14112001, -0.7568025 ]) >>> a < 3 array([ True, True, False, False], dtype=bool)
矩陣的乘法,使用np.dot()來實現
>>> A = np.array([[1, 1], [1, 0]]) >>> B = np.array([[1 ,0], [0, 1]]) >>> np.dot(A, B) array([[1, 1], [1, 0]]) >>> A * B array([[1, 0], [0, 0]])
sum(), max(), min()函數返回數組元素的和、最大值、最小值,同時可以指定在哪一個axis進行運算
>>> a = np.arange(0,6).reshape(2,3) >>> a array([[0, 1, 2], [3, 4, 5]]) >>> a.sum() 15 >>> a.sum(axis=0) # 在第一個axis上進行運算,在這裏是列 array([3, 5, 7]) >>> a.sum(axis=1) # 在第二個axis上,即行 array([ 3, 12]) >>> a.max() 5 >>> a.max(axis=0) array([3, 4, 5]) >>> a.max(axis=1) array([2, 5]) >>> a.min() 0 >>> a.min(axis=0) array([0, 1, 2]) >>> a.min(axis=1) array([0, 3]) >>>
還有一些比如np.sin(), np.cos(),np.exp()等一些通用函數可進行復雜數學運算。