Numpy入門1

標準安裝python里面提供了兩種表示數(shù)組的方法:

  1. list
  2. 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ù):

  1. arange函數(shù)
  2. 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ù)組有多個軸,因此它的下標需要用多個值來表示。

image.png

能看懂這個圖,就基本上理解了多維數(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容