1. 創(chuàng)建數(shù)組
1.1 array()
可以利用array()函數(shù)將Python列表或元組類型數(shù)據(jù)直接轉(zhuǎn)化為numpy.array數(shù)組(以下簡稱為“數(shù)組”)。
import numpy as np
a = np.array([2, 3, 4])
# note that `a=np.array(2, 3, 4)` is wrong
a
Out[3]: array([2, 3, 4])
a.dtype
Out[4]: dtype('int32')
b = np.array([1.2, 3.5, 5.1])
b
Out[6]: array([ 1.2, 3.5, 5.1])
b.dtype
Out[7]: dtype('float64')
利用array()函數(shù),還可以根據(jù)參數(shù)中序列的嵌套層數(shù)創(chuàng)建二維或三維數(shù)組。同時(shí),可以通過array()函數(shù)中的dtype參數(shù)指定數(shù)組中的數(shù)據(jù)類型。
c = np.array([(1.5, 2, 3), (4, 5, 6)])
c
Out[9]:
array([[ 1.5, 2. , 3. ],
[ 4. , 5. , 6. ]])
d = np.array([[1, 2], [3, 4]], dtype=complex)
d
Out[11]:
array([[ 1.+0.j, 2.+0.j],
[ 3.+0.j, 4.+0.j]])
1.2 zeros()和ones()和empty()
多數(shù)情況下,數(shù)組的維數(shù)及數(shù)據(jù)數(shù)量是已知的,但具體的數(shù)據(jù)值是未知的。此時(shí)可以利用zeros()、ones()、empty()函數(shù)創(chuàng)建數(shù)組,其中的初始數(shù)據(jù)起到占位作用。
-
zeros()函數(shù)創(chuàng)建的數(shù)組中,所有初始數(shù)據(jù)均為0; -
ones()函數(shù)創(chuàng)建的數(shù)組中,所有初始數(shù)據(jù)均為1; -
empty()函數(shù)創(chuàng)建的數(shù)組中,所有初始數(shù)據(jù)是隨機(jī)生成的,且與存儲(chǔ)狀態(tài)有關(guān)。
np.zeros((3,4))
Out[12]:
array([[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.]])
np.ones((2,3,4), dtype=np.int16)
Out[13]:
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))
Out[14]:
array([[ 1.5, 2. , 3. ],
[ 4. , 5. , 6. ]])
1.3 arange()和linspace()
利用arange()和linspace()函數(shù)可以創(chuàng)建一個(gè)由數(shù)列組成的數(shù)組。二者的區(qū)別在于arange()函數(shù)中定義的是數(shù)組中元素間的步長,而linspace()函數(shù)中定義的則是數(shù)組中元素的數(shù)量。
np.arange( 10, 30, 5 )
Out[16]: array([10, 15, 20, 25])
np.arange( 0, 2, 0.3 )
Out[17]: array([ 0. , 0.3, 0.6, 0.9, 1.2, 1.5, 1.8])
np.linspace( 0, 2, 9 )
Out[18]: array([ 0. , 0.25, 0.5 , 0.75, 1. , 1.25, 1.5 , 1.75, 2. ])
2. 數(shù)組的基本屬性
通過以上方法創(chuàng)建的數(shù)組均為numpy.ndarray類型,其主要屬性包括:
-
ndarray.ndim: 數(shù)組的維數(shù); -
ndarray.shape: 返回一個(gè)由整數(shù)構(gòu)成的元組,給出數(shù)組中每一維中的元素?cái)?shù)量,例如一個(gè)由n行和m列構(gòu)成的矩陣,其ndarray.shape的返回結(jié)果為(n, m); -
ndarray.size: 返回?cái)?shù)組中所有元素的數(shù)量,其數(shù)值等于ndarray.shape返回的元組中的各個(gè)元組的乘積; -
ndarray.dtype: 返回?cái)?shù)組中所有元素的數(shù)據(jù)類型(數(shù)組中所有元素的類型需保持一致);
e = np.arange(15).reshape(3, 5)
e
Out[25]:
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
e.ndim
Out[26]: 2
e.shape
Out[27]: (3, 5)
e.size
Out[28]: 15
e.dtype
Out[29]: dtype('int32')
3. 基本算數(shù)操作
對(duì)數(shù)組進(jìn)行算數(shù)操作,實(shí)際上是對(duì)其中的各個(gè)元素依次進(jìn)行算術(shù)操作。注意,乘號(hào)*只進(jìn)行簡單的元素間相乘,如果想要完成矩陣相乘,則應(yīng)使用dot()函數(shù)或方法。
a = np.array([20, 30, 40, 50])
b = np.arange(4)
b
Out[32]: array([0, 1, 2, 3])
c = a - b
c
Out[34]: array([20, 29, 38, 47])
b**2
Out[35]: array([0, 1, 4, 9], dtype=int32)
10 * np.sin(a)
Out[36]: array([ 9.12945251, -9.88031624, 7.4511316 , -2.62374854])
a < 35
Out[37]: array([ True, True, False, False], dtype=bool)
A = np.array([[1, 1], [0, 1]])
B = np.array([[2, 0], [3, 4]])
A*B
Out[40]:
array([[2, 0],
[0, 4]])
A.dot(B)
Out[41]:
array([[5, 4],
[3, 4]])
np.dot(A, B)
Out[43]:
array([[5, 4],
[3, 4]])
諸如+=和*=之類的運(yùn)算符,其運(yùn)算結(jié)果會(huì)用來更改原有的數(shù)組,而不會(huì)新建數(shù)組。但當(dāng)兩個(gè)數(shù)組中的數(shù)據(jù)類型不同時(shí),應(yīng)注意數(shù)據(jù)類型轉(zhuǎn)換的問題,避免引發(fā)異常。
a = np.ones((2,3), dtype=int)
b = np.random.random((2, 3))
a *= 3
a
Out[61]:
array([[3, 3, 3],
[3, 3, 3]])
b += a
# if we use `a += b`, it will raise an exception
# because `b` is not automatically converted to integer type
b
Out[63]:
array([[ 3.81943122, 3.59808999, 3.27408353],
[ 3.73746823, 3.57589972, 3.05348849]])
一些單元運(yùn)算符,如求和計(jì)算,可以通過numpy.ndarray類中的方法來實(shí)現(xiàn)。默認(rèn)情況下,這些方法會(huì)應(yīng)用于數(shù)組中的所有元素,但也可以通過定義這些方法中的axis參數(shù),將這些方法應(yīng)用于數(shù)組中的某一維度。
a = np.arange(12).reshape(3,4)
a
Out[50]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
a.sum()
Out[51]: 66
a.sum(axis=0)
Out[52]: array([12, 15, 18, 21])
a.min()
Out[53]: 0
a.min(axis=1)
Out[54]: array([0, 4, 8])
a.cumsum()
Out[55]: array([ 0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66], dtype=int32)
a.cumsum(axis=1)
Out[56]:
array([[ 0, 1, 3, 6],
[ 4, 9, 15, 22],
[ 8, 17, 27, 38]], dtype=int32)
numpy中還提供了一些簡單的數(shù)學(xué)函數(shù),如exp()、sqrt()、sin()等。這些函數(shù)也是對(duì)數(shù)組中每個(gè)元素依次進(jìn)行操作的。
A = np.arange(3)
np.exp(A)
Out[66]: array([ 1. , 2.71828183, 7.3890561 ])
np.sqrt(A)
Out[67]: array([ 0. , 1. , 1.41421356])
B = np.array([2., -1., 4.])
np.add(A, B)
Out[69]: array([ 2., 0., 6.])