您好,登錄后才能下訂單哦!
這篇文章主要講解了“NumPy中ndarray多維數(shù)組操作方法”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“NumPy中ndarray多維數(shù)組操作方法”吧!
NumPy一個(gè)非常重要的作用就是可以進(jìn)行多維數(shù)組的操作,多維數(shù)組對(duì)象也叫做ndarray。我們可以在ndarray的基礎(chǔ)上進(jìn)行一系列復(fù)雜的數(shù)學(xué)運(yùn)算。
本文將會(huì)介紹一些基本常見的ndarray操作,大家可以在數(shù)據(jù)分析中使用。
創(chuàng)建ndarray有很多種方法,我們可以使用np.random來隨機(jī)生成數(shù)據(jù):
import numpy as np# Generate some random datadata = np.random.randn(2, 3)data
array([[ 0.0929, 0.2817, 0.769 ], [ 1.2464, 1.0072, -1.2962]])
除了隨機(jī)創(chuàng)建之外,還可以從list中創(chuàng)建:
data1 = [6, 7.5, 8, 0, 1] arr1 = np.array(data1)
array([6. , 7.5, 8. , 0. , 1. ])
從list中創(chuàng)建多維數(shù)組:
data2 = [[1, 2, 3, 4], [5, 6, 7, 8]] arr2 = np.array(data2)
array([[1, 2, 3, 4], [5, 6, 7, 8]])
使用np.zeros創(chuàng)建初始值為0的數(shù)組:
np.zeros(10) array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
創(chuàng)建2維數(shù)組:
np.zeros((3, 6))
array([[0., 0., 0., 0., 0., 0.], [0., 0., 0., 0., 0., 0.], [0., 0., 0., 0., 0., 0.]])
使用empty創(chuàng)建3維數(shù)組:
np.empty((2, 3, 2))
array([[[0., 0.], [0., 0.], [0., 0.]], [[0., 0.], [0., 0.], [0., 0.]]])
注意,這里我們看到empty創(chuàng)建的數(shù)組值為0,其實(shí)并不是一定的,empty會(huì)從內(nèi)存中隨機(jī)挑選空間來返回,并不能保證這些空間中沒有值。所以我們?cè)谑褂胑mpty創(chuàng)建數(shù)組之后,在使用之前,還要記得初始化他們。
使用arange創(chuàng)建范圍類的數(shù)組:
np.arange(15)
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
指定數(shù)組中元素的dtype:
arr1 = np.array([1, 2, 3], dtype=np.float64) arr2 = np.array([1, 2, 3], dtype=np.int32)
可以通過data.shape獲得數(shù)組的形狀。
data.shape(2, 3)
通過ndim獲取維數(shù)信息:
arr2.ndim 2
可以通過data.dtype獲得具體的數(shù)據(jù)類型。
data.dtype dtype('float64')
在創(chuàng)建好一個(gè)類型的ndarray之后,還可以對(duì)其進(jìn)行轉(zhuǎn)換:
arr = np.array([1, 2, 3, 4, 5]) arr.dtype dtype('int64') float_arr = arr.astype(np.float64) float_arr.dtype dtype('float64')
上面我們使用astype將int64類型的ndarray轉(zhuǎn)換成了float64類型的。
如果轉(zhuǎn)換類型的范圍不匹配,則會(huì)自動(dòng)進(jìn)行截?cái)嗖僮鳎?/p>
arr = np.array([3.7, -1.2, -2.6, 0.5, 12.9, 10.1]) arr.astype(np.int32) array([ 3, -1, -2, 0, 12, 10], dtype=int32)
注意,這里是把小數(shù)截?cái)啵]有向上或者向下取整。
數(shù)組可以和常量進(jìn)行運(yùn)算,也可以和數(shù)組進(jìn)行運(yùn)算:
arr = np.array([[1., 2., 3.], [4., 5., 6.]]) arr * arr array([[ 1., 4., 9.], [16., 25., 36.]]) arr + 10 array([[11., 12., 13.], [14., 15., 16.]]) arr - arr array([[0., 0., 0.], [0., 0., 0.]]) 1 / arr array([[1. , 0.5 , 0.3333], [0.25 , 0.2 , 0.1667]]) arr ** 0.5 array([[1. , 1.4142, 1.7321], [2. , 2.2361, 2.4495]])
數(shù)組之間還可以進(jìn)行比較,比較的是數(shù)組中每個(gè)元素的大?。?/p>
arr2 = np.array([[0., 4., 1.], [7., 2., 12.]]) arr2 > arr array([[False, True, False], [ True, False, True]])
先看下index和切片的基本使用,index基本上和普通數(shù)組的使用方式是一樣的,用來訪問數(shù)組中某一個(gè)元素。
切片要注意的是切片后返回的數(shù)組中的元素是原數(shù)組中元素的引用,修改切片的數(shù)組會(huì)影響到原數(shù)組。
# 構(gòu)建一維數(shù)組 arr = np.arange(10) array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) # index訪問 arr[5] 5 # 切片訪問 arr[5:8] array([5, 6, 7]) # 切片修改 arr[5:8] = 12 array([ 0, 1, 2, 3, 4, 12, 12, 12, 8, 9]) # 切片可以修改原數(shù)組的值 arr_slice = arr[5:8] arr_slice[1] = 12345 arr array([ 0, 1, 2, 3, 4, 12, 12345, 12, 8, 9]) # 構(gòu)建二維數(shù)組 arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) arr2d[2] array([7, 8, 9]) # index 二維數(shù)組 arr2d[0][2] 3 # index二維數(shù)組 arr2d[0, 2] 3 # 構(gòu)建三維數(shù)組 arr3d = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]]) arr3d array([[[ 1, 2, 3], [ 4, 5, 6]], [[ 7, 8, 9], [10, 11, 12]]]) # index三維數(shù)組 arr3d[0] array([[1, 2, 3], [4, 5, 6]]) # copy是硬拷貝,和原數(shù)組的值相互不影響 old_values = arr3d[0].copy() arr3d[0] = 42 arr3d array([[[42, 42, 42], [42, 42, 42]], [[ 7, 8, 9], [10, 11, 12]]]) arr3d[0] = old_values arr3d array([[[ 1, 2, 3], [ 4, 5, 6]], [[ 7, 8, 9], [10, 11, 12]]]) # index 三維數(shù)組 arr3d[1, 0] array([7, 8, 9]) x = arr3d[1] x array([[ 7, 8, 9], [10, 11, 12]]) x[0] array([7, 8, 9])
slice還可以作為index使用,作為index使用表示的就是一個(gè)index范圍值。
作為index表示的slice可以有多種形式。
有頭有尾的,表示index從1開始到6-1結(jié)束:
arr[1:6]
array([ 1, 2, 3, 4, 64])
無頭有尾的,表示index從0開始,到尾-1結(jié)束:
arr2d[:2]
array([[1, 2, 3], [4, 5, 6]])
有頭無尾的,表示從頭開始,到所有的數(shù)據(jù)結(jié)束:
arr2d[:2, 1:]
array([[2, 3], [5, 6]])
arr2d[1, :2]
array([4, 5])
index還可以使用boolean值,表示是否選擇這一個(gè)index的數(shù)據(jù)。
我們先看下怎么構(gòu)建一個(gè)boolean類型的數(shù)組:
names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe']) names == 'Bob' array([ True, False, False, True, False, False, False])
上面我們通過比較的方式返回了一個(gè)只包含True和False的數(shù)組。
這個(gè)數(shù)組可以作為index值來訪問數(shù)組:
# 構(gòu)建一個(gè)7 * 4 的數(shù)組 data = np.random.randn(7, 4) array([[ 0.275 , 0.2289, 1.3529, 0.8864], [-2.0016, -0.3718, 1.669 , -0.4386], [-0.5397, 0.477 , 3.2489, -1.0212], [-0.5771, 0.1241, 0.3026, 0.5238], [ 0.0009, 1.3438, -0.7135, -0.8312], [-2.3702, -1.8608, -0.8608, 0.5601], [-1.2659, 0.1198, -1.0635, 0.3329]]) # 通過boolean數(shù)組來訪問: data[names == 'Bob'] array([[ 0.275 , 0.2289, 1.3529, 0.8864], [-0.5771, 0.1241, 0.3026, 0.5238]])
在索引行的時(shí)候,還可以索引列:
data[names == 'Bob', 3] array([0.8864, 0.5238])
可以用 ~
符號(hào)來取反:
data[~(names == 'Bob')] array([[-2.0016, -0.3718, 1.669 , -0.4386], [-0.5397, 0.477 , 3.2489, -1.0212], [ 0.0009, 1.3438, -0.7135, -0.8312], [-2.3702, -1.8608, -0.8608, 0.5601], [-1.2659, 0.1198, -1.0635, 0.3329]])
我們可以通過布爾型數(shù)組設(shè)置值,在實(shí)際的項(xiàng)目中非常有用:
data[data < 0] = 0 array([[0.275 , 0.2289, 1.3529, 0.8864], [0. , 0. , 1.669 , 0. ], [0. , 0.477 , 3.2489, 0. ], [0. , 0.1241, 0.3026, 0.5238], [0.0009, 1.3438, 0. , 0. ], [0. , 0. , 0. , 0.5601], [0. , 0.1198, 0. , 0.3329]])
data[names != 'Joe'] = 7 array([[7. , 7. , 7. , 7. ], [0. , 0. , 1.669 , 0. ], [7. , 7. , 7. , 7. ], [7. , 7. , 7. , 7. ], [7. , 7. , 7. , 7. ], [0. , 0. , 0. , 0.5601], [0. , 0.1198, 0. , 0.3329]])
Fancy indexing也叫做花式索引,它是指使用一個(gè)整數(shù)數(shù)組來進(jìn)行索引。
舉個(gè)例子,我們先創(chuàng)建一個(gè) 8 * 4的數(shù)組:
arr = np.empty((8, 4)) for i in range(8): arr[i] = i arr
array([[0., 0., 0., 0.], [1., 1., 1., 1.], [2., 2., 2., 2.], [3., 3., 3., 3.], [4., 4., 4., 4.], [5., 5., 5., 5.], [6., 6., 6., 6.], [7., 7., 7., 7.]])
然后使用一個(gè)整數(shù)數(shù)組來索引,那么將會(huì)以指定的順序來選擇行:
arr[[4, 3, 0, 6]] array([[4., 4., 4., 4.], [3., 3., 3., 3.], [0., 0., 0., 0.], [6., 6., 6., 6.]])
還可以使用負(fù)值來索引:
arr[[-3, -5, -7]]
array([[5., 5., 5., 5.], [3., 3., 3., 3.], [1., 1., 1., 1.]])
花式索引還可以組合來使用:
arr = np.arange(32).reshape((8, 4)) arr
array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11], [12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 22, 23], [24, 25, 26, 27], [28, 29, 30, 31]])
上面我們構(gòu)建了一個(gè)8 * 4的數(shù)組。
arr[[1, 5, 7, 2], [0, 3, 1, 2]]
array([ 4, 23, 29, 10])
然后取他們的第2列的第一個(gè)值,第6列的第三個(gè)值等等。最后得到一個(gè)1維的數(shù)組。
我們可以在不同維度的數(shù)組之間進(jìn)行變換,還可以轉(zhuǎn)換數(shù)組的軸。
reshape方法可以將數(shù)組轉(zhuǎn)換成為任意的形狀:
arr = np.arange(15).reshape((3, 5)) arr
array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14]])
數(shù)組還提供了一個(gè)T命令,可以將數(shù)組的軸進(jìn)行對(duì)調(diào):
arr.T
array([[ 0, 5, 10], [ 1, 6, 11], [ 2, 7, 12], [ 3, 8, 13], [ 4, 9, 14]])
對(duì)于高維數(shù)組,可以使用transpose來進(jìn)行軸的轉(zhuǎn)置:
arr = np.arange(16).reshape((2, 2, 4)) arr array([[[ 0, 1, 2, 3], [ 4, 5, 6, 7]], [[ 8, 9, 10, 11], [12, 13, 14, 15]]]) arr.transpose((1, 0, 2))
array([[[ 0, 1, 2, 3], [ 8, 9, 10, 11]], [[ 4, 5, 6, 7], [12, 13, 14, 15]]])
上面的transpose((1, 0, 2)) 怎么理解呢?
其含義是將x,y軸對(duì)調(diào),z軸保持不變。
上面我們通過使用reshape((2, 2, 4))方法創(chuàng)建了一個(gè)3維,也就是3個(gè)軸的數(shù)組。 其shape是 2 * 2 * 4 。
先看下對(duì)應(yīng)關(guān)系:
(0,0)-》 [ 0, 1, 2, 3]
(0,1)-》 [ 4, 5, 6, 7]
(1,0)-》 [ 8, 9, 10, 11]
(1,1)-》 [12, 13, 14, 15]
轉(zhuǎn)換之后:
(0,0)-》 [ 0, 1, 2, 3]
(0,1)-》 [ 8, 9, 10, 11]
(1,0)-》[ 4, 5, 6, 7]
(1,1)-》 [12, 13, 14, 15]
于是得到了我們上面的的結(jié)果。
多維數(shù)組的軸轉(zhuǎn)換可能比較復(fù)雜,大家多多理解。
還可以使用 swapaxes 來交換兩個(gè)軸,上面的例子可以重寫為:
arr.swapaxes(0,1)
感謝各位的閱讀,以上就是“NumPy中ndarray多維數(shù)組操作方法”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)NumPy中ndarray多維數(shù)組操作方法這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。