標準安裝python里面提供了兩種表示數(shù)組的方法:
- list
- array
list的缺點:
標準安裝的Python中用列表(list)保存一組值,可以用來當作數(shù)組使用,不過由于列表的元素可以是任何對象,因此列表中所保存的是對象的指針。這樣為了保存一個簡單的[1,2,3],需要有3個指針和三個整數(shù)對象。對于數(shù)值運算來說這種結(jié)構(gòu)顯然比較浪費內(nèi)存和CPU計算時間。
array的缺點:
array對象和列表不同,它直接保存數(shù)值,和C語言的一維數(shù)組比較類似。但是由于它不支持多維,也沒有各種運算函數(shù),因此也不適合做數(shù)值運算。
所以,對于矩陣運算和矩陣處理更好的方法是,使用numpy庫。
1. 創(chuàng)建一維矩陣和多維矩陣
使用np的array函數(shù)來創(chuàng)建
a = np.array([1, 2, 3, 4])
b = np.array((5, 6, 7, 8))
c = np.array([[1, 2, 3, 4],[4, 5, 6, 7], [7, 8, 9, 10]])
shape屬性
>>> a.shape
(4,)
>>> c.shape
(3, 4)
修改shape屬性的方法:
#方法1:
#修改shape屬性,由原來的(3,4)改為現(xiàn)在的(4,3)
#修改之后,矩陣的形狀也會改變
>>> c.shape = 4,3
>>> c
array([[ 1, 2, 3],
[ 4, 4, 5],
[ 6, 7, 7],
[ 8, 9, 10]])
#當某個軸的元素為-1時,將根據(jù)數(shù)組元素的個數(shù)自動計算此軸的長度
#因此下面的程序?qū)?shù)組c的shape改為了(2,6)
>>> c.shape = 2,-1
>>> c
array([[ 1, 2, 3, 4, 4, 5],
[ 6, 7, 7, 8, 9, 10]])
#方法2,使用reshape方法
>>> d = c.reshape((4,3))
數(shù)據(jù)元素的屬性:
>>> c.dtype
dtype('int64')
#同時也可以在創(chuàng)建數(shù)組的時候,指明元素的類型
#指明是float
>>> np.array([[1, 2, 3, 4],[4, 5, 6, 7], [7, 8, 9, 10]], dtype=np.float)
array([[ 1., 2., 3., 4.],
[ 4., 5., 6., 7.],
[ 7., 8., 9., 10.]])
#指明是complex
>>> np.array([[1, 2, 3, 4],[4, 5, 6, 7], [7, 8, 9, 10]], dtype=np.complex)
array([[ 1.+0.j, 2.+0.j, 3.+0.j, 4.+0.j],
[ 4.+0.j, 5.+0.j, 6.+0.j, 7.+0.j],
[ 7.+0.j, 8.+0.j, 9.+0.j, 10.+0.j]])
</br>
剛才創(chuàng)建數(shù)組的辦法,都是手動輸入一個序列,這樣的做法,顯然效率不高。numpy提供了專門創(chuàng)建數(shù)組的函數(shù)。
主要是兩個函數(shù):
- arange函數(shù)
- linspace函數(shù)
arange函數(shù)類似于python的range函數(shù),通過指定開始值、終值和步長來創(chuàng)建一維數(shù)組,注意數(shù)組不包括終值:
>>> np.arange( 0, 1, 0.1)
array([ 0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])
np.arange(10) 等價于 np.arange(0,10,1)
linspace函數(shù)通過指定開始值、終值和元素個數(shù)來創(chuàng)建一維數(shù)組,可以通過endpoint關(guān)鍵字指定是否包括終值,缺省設置是包括終值:
#注意linspace(0,1,10) 和 linspace(0,1,11)的區(qū)別
In [2]: np.linspace(0,1,10)
Out[2]:
array([ 0. , 0.11111111, 0.22222222, 0.33333333, 0.44444444,
0.55555556, 0.66666667, 0.77777778, 0.88888889, 1. ])
In [3]: np.linspace(0,1,11)
Out[3]: array([ 0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ])
np.arange(args1,args2,args3) 函數(shù)和
np.linspace(args1,args2,args3) 函數(shù)
的區(qū)別在于:
arange函數(shù)的三個參數(shù)分別是區(qū)間起點,區(qū)間終點,和步長
linspace函數(shù)的三個參數(shù)分別是區(qū)間的起點,區(qū)間的終點(閉區(qū)間包含終點),這個區(qū)間包含的點
2. 訪問元素
2.1 下標訪問元素
>>> a = np.arange(10)
>>> a[5] # 用整數(shù)作為下標可以獲取數(shù)組中的某個元素
5
2.2 切片訪問元素
>>> a[3:5] # 用范圍作為下標獲取數(shù)組的一個切片,包括a[3]不包括a[5]
array([3, 4])
#切片的第三個參數(shù) 表示步長
array([ 0, 1, 100, 101, 4, 5, 6, 7, 8, 9])
>>> a[1:-1:2] # 范圍中的第三個參數(shù)表示步長,2表示隔一個元素取一個元素
array([ 1, 101, 5, 7])
2.3 使用整數(shù)序列訪問
>>> x=array([10, 9, 8, 7, 6, 5, 4, 3, 2])
>>> x[[3, 3, 1, 8]] # 獲取x中的下標為3, 3, 1, 8的4個元素,組成一個新的數(shù)組
array([7, 7, 9, 2])
2.4 使用布爾數(shù)組訪問
x=array([5, 4, 3, 2, 1])
>>> x[np.array([True, False, True, False, False])]
#輸出的結(jié)果是 array([5, 3])
#布爾數(shù)組的長度不夠時,不夠的部分都當作False
array([4, 5, 4, 5, 5])
>>> x[np.array([True, False, True, True])]
>>> # 布爾數(shù)組的長度不夠時,不夠的部分都當作False
array([5, 3, 2])
3. 多維數(shù)組
多維數(shù)組的存取和一維數(shù)組類似,因為多維數(shù)組有多個軸,因此它的下標需要用多個值來表示。

能看懂這個圖,就基本上理解了多維數(shù)組的訪問方式了。
4. 創(chuàng)建一個0到1 的隨機矩陣
from numpy import random
randArray = random.random(size=(2,4))
#輸出
#array([[0.93848018,0.42005976,0.81470729,0.98797783],[0.12242703,0.42756378,0.59705163,0.36619101]])
5. 創(chuàng)建一個指定范圍的隨機矩陣
from numpy import random
random.randint(1,100,size=(3,3))
#輸出
#array([[74,76,46],[90,16,8],[21,41,31]])
numpy的參考資料:
英文:https://docs.scipy.org/doc/numpy-dev/user/quickstart.html
中文:http://old.sebug.net/paper/books/scipydoc/numpy_intro.html