日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

numpy 数组抽取_清晰易懂的Numpy入门教程

發(fā)布時間:2023/12/3 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 numpy 数组抽取_清晰易懂的Numpy入门教程 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

原標(biāo)題:清晰易懂的Numpy入門教程

翻譯 | 石頭

來源 | Machine Learning Plus

Numpy是python語言中最基礎(chǔ)和最強(qiáng)大的科學(xué)計算和數(shù)據(jù)處理的工具包,如數(shù)據(jù)分析工具pandas也是基于numpy構(gòu)建的,機(jī)器學(xué)習(xí)包scikit-learn也大量使用了numpy方法。本文介紹了Numpy的n維數(shù)組在數(shù)據(jù)處理和分析的所有核心應(yīng)用。

目錄

1. 如何構(gòu)建numpy數(shù)組

2. 如何觀察數(shù)組屬性的大小和形狀(shape)

3. 如何從數(shù)組提取特定的項

4. 如何從現(xiàn)有的數(shù)組定義新數(shù)組

5. 多維數(shù)組的重構(gòu)(reshaping)和扁平(flattening)

6. 如何通過numpy生成序列數(shù)(sequences),重復(fù)數(shù)(repetitions)和隨機(jī)數(shù)(random)

7. 小結(jié)

1. 如何構(gòu)建numpy數(shù)組

構(gòu)建numpy數(shù)組的方法很多,比較常用的方法是用np.array函數(shù)對列表進(jìn)行轉(zhuǎn)化。

# 通過列表創(chuàng)建一維數(shù)組

importnumpyasnp

list1=[0,1,2,3,4]

arr1d=np.array(list1)

#打印數(shù)組和類型

print(type(arr1d))

arr1d

[01234]

數(shù)組和列表最關(guān)鍵的區(qū)別是:數(shù)組是基于向量化操作的,列表不是,我們在實際項目中處理的數(shù)據(jù)一般是矩陣結(jié)構(gòu),對該數(shù)據(jù)以行向量或列向量的形式進(jìn)行計算,向量計算是基于數(shù)組實現(xiàn)的,因此數(shù)組比列表的應(yīng)用更廣。

函數(shù)可以應(yīng)用到數(shù)組的每一項,列表不行。

比如,不可以對列表的每一項數(shù)據(jù)都加2,這是錯誤的。

list1+2# 錯誤

可以對數(shù)組的某一項數(shù)據(jù)都加2

# Add 2 to each element of arr1d

arr1d+2

#> array([2, 3, 4, 5, 6])

另一個區(qū)別是已經(jīng)定義的numpy數(shù)組不可以增加數(shù)組大小,只能通過定義另一個數(shù)組來實現(xiàn),但是列表可以增加大小。

然而,numpy有更多的優(yōu)勢,讓我們一起來發(fā)現(xiàn)。

numpy可以通過列表中的列表來構(gòu)建二維數(shù)組。

# Create a 2d array from a list of lists

list2=[[0,1,2],[3,4,5],[6,7,8]]

arr2d=np.array(list2)

arr2d

#> array([[0, 1, 2],

#> [3, 4, 5],

#> [6, 7, 8]])

你也可以通過dtype參數(shù)指定數(shù)組的類型,一些最常用的numpy類型是:'float','int','bool','str'和'object'。

# Create a float 2d array

arr2d_f=np.array(list2,dtype='float')

arr2d_f

#> array([[ 0., 1., 2.],

#> [ 3., 4., 5.],

#> [ 6., 7., 8.]])

輸出結(jié)果的小數(shù)點表示float類型,你也可以通過 astype方法轉(zhuǎn)換成不同的類型。

# 轉(zhuǎn)換成‘int’類型

arr2d_f.astype('int')

#> array([[0, 1, 2],

#> [3, 4, 5],

#> [6, 7, 8]])# 先轉(zhuǎn)換‘int’類型,再轉(zhuǎn)換‘str’類型

arr2d_f.astype('int').astype('str')

#> array([['0', '1', '2'],

#> ['3', '4', '5'],

#> ['6', '7', '8']],

#> dtype='U21')

另一個區(qū)別是數(shù)組要求所有項是同一個類型,list沒有這個限制。如果你想要一個數(shù)組包含不同類型,設(shè)置‘dtype’為'object'。

# 構(gòu)建布爾類型數(shù)組

arr2d_b=np.array([1,0,10],dtype='bool')

arr2d_b

#> array([ True, False, True], dtype=bool)# 構(gòu)建包含數(shù)值和字符串的數(shù)組

arr1d_obj=np.array([1,'a'],dtype='object')

arr1d_obj

#> array([1, 'a'], dtype=object)

最終使用 tolist函數(shù)使數(shù)組轉(zhuǎn)化為列表。

# Convert an array back to a list

arr1d_obj.tolist

#> [1, 'a']

總結(jié)數(shù)組和列表主要的區(qū)別:

數(shù)組支持向量化操作,列表不支持;

數(shù)組不能改變長度,列表可以;

數(shù)組的每一項都是同一類型,list可以有多種類型;

同樣長度的數(shù)組所占的空間小于列表;

2. 如何觀察數(shù)組屬性的大小和形狀(shape)

一維數(shù)組由列表構(gòu)建,二維數(shù)組arr2d由列表的列表構(gòu)建,二維數(shù)組有行和列,比如矩陣,三維數(shù)組由嵌入了兩個列表的列表構(gòu)建。

假設(shè)給定一個數(shù)組,我們怎么去了解該數(shù)組的屬性。

數(shù)組的屬性包括:

數(shù)組的維度(ndim)

數(shù)組的形狀(shape)

數(shù)組的類型(dtype)

數(shù)組的大小(size)

數(shù)組元素的表示(通過索引)

# 定義3行4列的二維數(shù)組

list2=[[1,2,3,4],[3,4,5,6],[5,6,7,8]]

arr2=np.array(list2,dtype='float')

arr2

#> array([[ 1., 2., 3., 4.],

#> [ 3., 4., 5., 6.],

#> [ 5., 6., 7., 8.]])# 形狀(shape)

print('Shape: ',arr2.shape)

# 數(shù)組類型(dtype)

print('Datatype: ',arr2.dtype)

# 數(shù)組大小(size)

print('Size: ',arr2.size)

# 數(shù)組維度(ndim)

print('Num Dimensions: ',arr2.ndim)

# 取數(shù)組第3行3列元素

print('items of 3 line 3 column: ',c[2,2])

#> Shape: (3, 4)

#> Datatype: float64

#> Size: 12

#> Num Dimensions: 2

#> items of 3 line 3 column: 7

3. 如何從數(shù)組提取特定的項

數(shù)組的索引是從0開始計數(shù)的,與list類似。numpy數(shù)組通過方括號的參數(shù)以選擇特定的元素。

# 選擇矩陣的前兩行兩列

arr2[:2,:2]

list2[:2,:2]# 錯誤

#> array([[ 1., 2.],

#> [ 3., 4.]])

numpy數(shù)組支持布爾類型的索引,布爾型索引數(shù)組與過濾前(array-to-be-filtered)的數(shù)組大小相等,布爾型數(shù)組只包含Ture和False變量,Ture變量對應(yīng)的數(shù)組索引位置保留了過濾前的值 。

arr2

#> array([[ 1., 2., 3., 4.],

#> [ 3., 4., 5., 6.],

#> [ 5., 6., 7., 8.]])# 對數(shù)組每一個元素是否滿足某一條件,然后獲得布爾類型的輸出

b=arr2>4

b

#> array([[False, False, False, False],

#> [False, False, True, True],

#> [ True, True, True, True]], dtype=bool)# 取布爾型數(shù)組保留的原始數(shù)組的值

arr2[b]

#> array([ 5., 6., 5., 6., 7., 8.])

3.1 如何反轉(zhuǎn)數(shù)組

# 反轉(zhuǎn)數(shù)組的行

arr2[::-1,]

#> array([[ 5., 6., 7., 8.],

#> [ 3., 4., 5., 6.],

#> [ 1., 2., 3., 4.]])# Reverse the row and column positions

# 反轉(zhuǎn)數(shù)組的行和列

arr2[::-1,::-1]

#> array([[ 8., 7., 6., 5.],

#> [ 6., 5., 4., 3.],

#> [ 4., 3., 2., 1.]])

3.2 如何處理數(shù)組的缺失值(missing)和無窮大(infinite)值

缺失值可以用np.nan對象表示,np.inf表示無窮大值,下面用二維數(shù)組舉例:

# 插入nan變量和inf變量

arr2[1,1]=np.nan# not a number

arr2[1,2]=np.inf# infinite

arr2

#> array([[ 1., 2., 3., 4.],

#> [ 3., nan, inf, 6.],

#> [ 5., 6., 7., 8.]])# 用-1代替nan值和inf值

missing_bool=np.isnan(arr2)|np.isinf(arr2)

arr2[missing_bool]=-1

arr2

#> array([[ 1., 2., 3., 4.],

#> [ 3., -1., -1., 6.],

#> [ 5., 6., 7., 8.]])

3.3 如何計算n維數(shù)組的平均值,最小值和最大值

# 平均值,最大值,最小值

print("Mean value is: ",arr2.mean)

print("Max value is: ",arr2.max)

print("Min value is: ",arr2.min)

#> Mean value is: 3.58333333333

#> Max value is: 8.0

#> Min value is: -1.0

如果要求數(shù)組的行或列的最小值,使用np.amin函數(shù)

# Row wise and column wise min

# 求數(shù)組行和列的最小值

# axis=0表示列,1表示行

print("Column wise minimum: ",np.amin(arr2,axis=0))

print("Row wise minimum: ",np.amin(arr2,axis=1))

#> Column wise minimum: [ 1. -1. -1. 4.]

#> Row wise minimum: [ 1. -1. 5.]

對數(shù)組的每個元素進(jìn)行累加,得到一維數(shù)組,一維數(shù)組的大小與二維數(shù)組相同。

# 累加

np.cumsum(arr2)

#> array([ 1., 3., 6., 10., 13., 12., 11., 17., 22., 28., 35., 43.])

4. 如何從現(xiàn)有的數(shù)組定義新數(shù)組

如果使用賦值運(yùn)算符從父數(shù)組定義新數(shù)組,新數(shù)組與父數(shù)組共占同一個內(nèi)存空間,如果改變新數(shù)組的值,那么父數(shù)組也相應(yīng)的改變。

為了讓新數(shù)組與父數(shù)組相互獨立,你需要使用copy函數(shù)。所有父數(shù)組都使用copy方法構(gòu)建新數(shù)組。

# Assign portion of arr2 to arr2a. Doesn't really create a new array.

# 分配arr2數(shù)組給新數(shù)組arr2a,下面方法并沒有定新數(shù)組

arr2a=arr2[:2,:2]

arr2a[:1,:1]=100# arr2相應(yīng)位置也改變了

arr2

#> array([[ 100., 2., 3., 4.],

#> [ 3., -1., -1., 6.],

#> [ 5., 6., 7., 8.]])# 賦值arr2數(shù)組的一部分給新數(shù)組arr2b

arr2b=arr2[:2,:2].copy

arr2b[:1,:1]=101# arr2沒有改變

arr2

#> array([[ 100., 2., 3., 4.],

#> [ 3., -1., -1., 6.],

#> [ 5., 6., 7., 8.]])

5. 多維數(shù)組的重構(gòu)(reshaping)和扁平(flattening)

重構(gòu)(reshaping)是改變了數(shù)組項的排列,即改變了數(shù)組的形狀,未改變數(shù)組的維數(shù)。

扁平(flattening)是對多維數(shù)組轉(zhuǎn)化為一維數(shù)組。

# 3x4數(shù)組重構(gòu)為4x3數(shù)組

arr2.reshape(4,3)

#> array([[ 100., 2., 3.],

#> [ 4., 3., -1.],

#> [ -1., 6., 5.],

#> [ 6., 7., 8.]])

5.1 flatten和ravel的區(qū)別

數(shù)組的扁平化有兩種常用的方法,flatten和ravel 。ravel處理后的數(shù)組是父數(shù)組的引用,因此新數(shù)組的任何變化也會改變父數(shù)組,因其未用復(fù)制的方式構(gòu)建數(shù)組,內(nèi)存使用效率高,flatten通過復(fù)制的方式構(gòu)建新數(shù)組。

# flatten方法

arr2.flatten

#> array([ 100., 2., 3., 4., 3., -1., -1., 6., 5., 6., 7., 8.])# flatten方法

b1=arr2.flatten

b1[0]=100# 改變b1的值并未影響arr2

arr2

#> array([[ 100., 2., 3., 4.],

#> [ 3., -1., -1., 6.],

#> [ 5., 6., 7., 8.]])# ravel方法

b2=arr2.ravel

b2[0]=101# 改變b2值,相應(yīng)的改變了arr2值

arr2

#> array([[ 101., 2., 3., 4.],

#> [ 3., -1., -1., 6.],

#> [ 5., 6., 7., 8.]])

6. 如何通過numpy生成序列數(shù)(sequences),重復(fù)數(shù)(repetitions)和隨機(jī)數(shù)(random)

np.arrange函數(shù)手動生成指定數(shù)目的序列數(shù),與ndarray作用一樣。

# 默認(rèn)下限為0

print(np.arange(5))

# 0 to 9,默認(rèn)步數(shù)為1

print(np.arange(0,10))

# 遞增步數(shù)2

print(np.arange(0,10,2))

# 降序

print(np.arange(10,0,-1))

#> [0 1 2 3 4]

#> [0 1 2 3 4 5 6 7 8 9]

#> [0 2 4 6 8]

#> [10 9 8 7 6 5 4 3 2 1]

上例是通過np.arrange設(shè)置初始位置和結(jié)束位置來生成序列數(shù),如果我們設(shè)置數(shù)組的元素個數(shù),那么可以自動計算數(shù)組的遞增值。

如構(gòu)建1到50的數(shù)組,數(shù)組有10個元素,使用np.linspace總動計算數(shù)組的遞增值。

# 起始位置和結(jié)束位置分別為1和50

np.linspace(start=1,stop=50,num=10,dtype=int)

#> array([ 1, 6, 11, 17, 22, 28, 33, 39, 44, 50])

我們注意到上面例子的遞增值并不相等,有5和6兩個值,原因是計算遞增值采用了四舍五入的算法(rounding)。與np.linspace類似,np.logspace以對數(shù)尺度的方式增長。

# 設(shè)置數(shù)組的精度為小數(shù)點后兩位

np.set_printoptions(precision=2)

# 起點為 10^1 and 終點為 10^50,數(shù)組元素個數(shù)10,以10為底數(shù)

np.logspace(start=1,stop=50,num=10,base=10)

#> array([ 1.00e+01, 2.78e+06, 7.74e+11, 2.15e+17, 5.99e+22,

#> 1.67e+28, 4.64e+33, 1.29e+39, 3.59e+44, 1.00e+50])

初始化數(shù)組的元素全為1或全為0。

np.zeros([2,2])

#> array([[ 0., 0.],

#> [ 0., 0.]])np.ones([2,2])

#> array([[ 1., 1.],

#> [ 1., 1.]])

7.1 如何構(gòu)建重復(fù)的序列數(shù)

np.tile重復(fù)整個的數(shù)組或列表n次,np.repeat重復(fù)數(shù)組每一項n次。

a=[1,2,3]

# 重復(fù)數(shù)組a兩次

print('Tile: ',np.tile(a,2))

# 重復(fù)數(shù)組a每項兩次

print('Repeat: ',np.repeat(a,2))

#> Tile: [1 2 3 1 2 3]

#> Repeat: [1 1 2 2 3 3]

7.2 如何生存隨機(jī)數(shù)

random模塊包含的函數(shù)可以生成任一數(shù)組形狀的隨機(jī)數(shù)和統(tǒng)計分布。

# 生成2行2列的[0,1)的隨機(jī)數(shù)

print(np.random.rand(2,2))

# 生成均值為0方差為1的2行2列的正態(tài)分布值

print(np.random.randn(2,2))

# 生成[0,10)的2行2列的隨機(jī)整數(shù)

print(np.random.randint(0,10,size=[2,2]))

# 生成一個[0,1)的隨機(jī)數(shù)

print(np.random.random)

# 生成[0,1)的2行2列的隨機(jī)數(shù)

print(np.random.random(size=[2,2]))

# 從給定的列表等概率抽樣10次

print(np.random.choice(['a','e','i','o','u'],size=10))

# 從給定的列表和對應(yīng)的概率分布抽樣10次

print(np.random.choice(['a','e','i','o','u'],size=10,p=[0.3,.1,0.1,0.4,0.1]))# picks more o's

#> [[ 0.84 0.7 ]

#> [ 0.52 0.8 ]]

#> [[-0.06 -1.55]

#> [ 0.47 -0.04]]

#> [[4 0]

#> [8 7]]

#> 0.08737272424956832

#> [[ 0.45 0.78]

#> [ 0.03 0.74]]

#> ['i' 'a' 'e' 'e' 'a' 'u' 'o' 'e' 'i' 'u']

#> ['o' 'a' 'e' 'a' 'a' 'o' 'o' 'o' 'a' 'o']

7.3 如何得到數(shù)組獨特(unique)的項和個數(shù)(counts)

np.unique函數(shù)去除數(shù)組中重復(fù)的元素,設(shè)置return_counts參數(shù)為True,得到數(shù)組每一項的個數(shù)。

# 定義范圍為[0,10),個數(shù)為10的隨機(jī)整數(shù)數(shù)組

np.random.seed(100)

arr_rand=np.random.randint(0,10,size=10)

print(arr_rand)

#> [8 8 3 7 7 0 4 2 5 2]# 得到數(shù)組獨特的項和相應(yīng)的個數(shù)

uniqs,counts=np.unique(arr_rand,return_counts=True)

print("Unique items : ",uniqs)

print("Counts : ",counts)

#> Unique items : [0 2 3 4 5 7 8]

#> Counts : [1 2 1 1 1 2 2]

8 小結(jié)

本文比較全面的介紹了numpy的基本用法,希望對numpy還不熟悉的同學(xué)有所幫助。返回搜狐,查看更多

責(zé)任編輯:

總結(jié)

以上是生活随笔為你收集整理的numpy 数组抽取_清晰易懂的Numpy入门教程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。