人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動(dòng)態(tài)

NumPy實(shí)現(xiàn)ndarray多維數(shù)組操作

發(fā)布日期:2022-07-04 14:46 | 文章來源:gibhub

簡介

NumPy一個(gè)非常重要的作用就是可以進(jìn)行多維數(shù)組的操作,多維數(shù)組對象也叫做ndarray。我們可以在ndarray的基礎(chǔ)上進(jìn)行一系列復(fù)雜的數(shù)學(xué)運(yùn)算。

本文將會介紹一些基本常見的ndarray操作,大家可以在數(shù)據(jù)分析中使用。

創(chuàng)建ndarray

創(chuàng)建ndarray有很多種方法,我們可以使用np.random來隨機(jī)生成數(shù)據(jù):

import numpy as np
# Generate some random data
data = 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會從內(nèi)存中隨機(jī)挑選空間來返回,并不能保證這些空間中沒有值。所以我們在使用empty創(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)

ndarray的屬性

可以通過data.shape獲得數(shù)組的形狀。

data.shape
(2, 3)

通過ndim獲取維數(shù)信息:

arr2.ndim
2

可以通過data.dtype獲得具體的數(shù)據(jù)類型。

data.dtype
dtype('float64')

ndarray中元素的類型轉(zhuǎn)換

在創(chuàng)建好一個(gè)類型的ndarray之后,還可以對其進(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)換類型的范圍不匹配,則會自動(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)?,并沒有向上或者向下取整。

ndarray的數(shù)學(xué)運(yùn)算

數(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和切片的基本使用,index基本上和普通數(shù)組的使用方式是一樣的,用來訪問數(shù)組中某一個(gè)元素。

切片要注意的是切片后返回的數(shù)組中的元素是原數(shù)組中元素的引用,修改切片的數(shù)組會影響到原數(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])

index with slice

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])

boolean index

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])

可以用 ~符號來取反:

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

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ù)組來索引,那么將會以指定的順序來選擇行:

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ù)組變換

我們可以在不同維度的數(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)行對調(diào):

arr.T
array([[ 0,  5, 10],
 [ 1,  6, 11],
 [ 2,  7, 12],
 [ 3,  8, 13],
 [ 4,  9, 14]])

對于高維數(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軸對調(diào),z軸保持不變。

上面我們通過使用reshape((2, 2, 4))方法創(chuàng)建了一個(gè)3維,也就是3個(gè)軸的數(shù)組。 其shape是 2 * 2 * 4 。

先看下對應(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)

到此這篇關(guān)于NumPy實(shí)現(xiàn)ndarray多維數(shù)組操作的文章就介紹到這了,更多相關(guān)NumPy ndarray多維數(shù)組操作內(nèi)容請搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!

海外服務(wù)器租用

版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。

相關(guān)文章

實(shí)時(shí)開通

自選配置、實(shí)時(shí)開通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問服務(wù)

1對1客戶咨詢顧問

在線
客服

在線客服:7*24小時(shí)在線

客服
熱線

400-630-3752
7*24小時(shí)客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部