什么是NumPy?
- Numpy是Python科學(xué)計(jì)算庫(kù),用于快速處理任意維度的數(shù)組。
- NumPy提供一個(gè)N維數(shù)組類型ndarray,它描述了相同類型的“items”的集合。
- numpy.ndarray支持向量化運(yùn)算。
- NumPy使用c語(yǔ)言寫的,底部解除了GIL,其對(duì)數(shù)組的操作速度不在受python解釋器限制。
NumPy和python中的列表有什么區(qū)別?
- python一個(gè)列表中可以存儲(chǔ)多種數(shù)據(jù)類型。比如a = [1,‘a(chǎn)’]是允許的,而NumPy中的數(shù)組只能存儲(chǔ)同種數(shù)據(jù)類型。
- NumPy中的數(shù)組可以是多維的,當(dāng)多維數(shù)組中所有的數(shù)據(jù)都是數(shù)值類型的時(shí)候,相當(dāng)于線性代數(shù)中的矩陣,是可以進(jìn)行相互間的運(yùn)算的。
如何創(chuàng)建一個(gè)NumPy數(shù)組?
- 根據(jù)Python中的列表生成:
import numpy as np
a1 = np.array([1,2,3,4])
print(a1)
- 使用np.arange生成,np.arange的用法類似于Python中的range:
import numpy as np
a2 = np.arange(2,21,2)
print(a2)
(arrange中前兩個(gè)參數(shù)代表列表的區(qū)間,第三個(gè)參數(shù)代表步長(zhǎng),即兩個(gè)相鄰元素之間的差值)
- 使用np.random生成隨機(jī)數(shù)的數(shù)組:
a1 = np.random.random(2,2) # 生成2行2列的隨機(jī)數(shù)的數(shù)組,元素大小在0-1之間
a2 = np.random.randint(0,10,size=(3,3)) # 元素是從0-10之間隨機(jī)的3行3列的數(shù)組
- 使用函數(shù)生成特殊的數(shù)組:
import numpy as np
a1 = np.zeros((2,2)) #生成一個(gè)所有元素都是0的2行2列的數(shù)組
a2 = np.ones((3,2)) #生成一個(gè)所有元素都是1的3行2列的數(shù)組
a3 = np.full((2,2),8) #生成一個(gè)所有元素都是8的2行2列的數(shù)組
a4 = np.eye(3) #生成一個(gè)對(duì)角矩陣,對(duì)角線上的元素全為1,其他元素都為0的3x3的矩陣
5. ndarray常用屬性:
ndarray.dtype:
- 默認(rèn)的數(shù)據(jù)類型:
import numpy as np
a1 = np.array([1,2,3])
print(a1.dtype)
# 如果是windows系統(tǒng),默認(rèn)是int32
# 如果是mac或者linux系統(tǒng),則根據(jù)系統(tǒng)來(lái)
- 指定dtype
import numpy as np
a1 = np.array([1,2,3],dtype=np.int64)
# 或者 a1 = np.array([1,2,3],dtype="i8")
print(a1.dtype)
- 修改dtype:
import numpy as np
a1 = np.array([1,2,3])
print(a1.dtype) # window系統(tǒng)下默認(rèn)是int32
# 以下修改dtype
a2 = a1.astype(np.int64) # astype不會(huì)修改數(shù)組本身,而是會(huì)將修改后的結(jié)果返回
print(a2.dtype)
ndarray.size:
獲取數(shù)組中總的元素的個(gè)數(shù)
import numpy as np
a1 = np.array([[1,2,3],[4,5,6]])
print(a1.size) #打印的是6,因?yàn)榭偣灿?個(gè)元素
ndarray.ndim:
獲取數(shù)組的維度
a1 = np.array([1,2,3])
print(a1.ndim) # 維度為1
a2 = np.array([[1,2,3],[4,5,6]])
print(a2.ndim) # 維度為2
a3 = np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])
print(a3.ndim) # 維度為3
ndarray.shape:
獲取數(shù)組某一維度對(duì)應(yīng)的元組
a1 = np.array([1,2,3])
print(a1.shape) # 輸出(3,),意思是一維數(shù)組,有3個(gè)數(shù)據(jù)
a2 = np.array([[1,2,3],[4,5,6]])
print(a2.shape) # 輸出(2,3),意思是二位數(shù)組,2行3列
a3 = np.array([
[
[1,2,3],
[4,5,6]
],
[
[7,8,9],
[10,11,12]
]
])
print(a3.shape) # 輸出(2,2,3),意思是三維數(shù)組,總共有2個(gè)元素,每個(gè)元素是2行3列的
a44 = np.array([1,2,3],[4,5])
print(a4.shape) # 輸出(2,),意思是a4是一個(gè)一維數(shù)組,總共有2列
print(a4) # 輸出[list([1, 2, 3]) list([4, 5])],其中最外面層是數(shù)組,里面是Python列表
ndarray.reshape
修改數(shù)組維度
a1 = np.arange(12) #生成一個(gè)有12個(gè)數(shù)據(jù)的一維數(shù)組
print(a1)
a2 = a1.reshape((3,4)) #變成一個(gè)2維數(shù)組,是3行4列的
print(a2)
a3 = a1.reshape((2,3,2)) #變成一個(gè)3維數(shù)組,總共有2塊,每一塊是2行2列的
print(a3)
a4 = a2.reshape((12,)) # 將a2的二維數(shù)組重新變成一個(gè)12列的1維數(shù)組
print(a4)
a5 = a2.flatten() # 不管a2是幾維數(shù)組,都將他變成一個(gè)一維數(shù)組
print(a5)
注意,reshape并不會(huì)修改原來(lái)數(shù)組本身,而是會(huì)將修改后的結(jié)果返回。如果想要直接修改數(shù)組本身,那么可以使用resize來(lái)替代reshape。
ndarray.itemsize:
返回?cái)?shù)組中每個(gè)元素所占字節(jié)的大小
a1 = np.array([1,2,3],dtype=np.int32)
print(a1.itemsize) # 打印4,因?yàn)槊總€(gè)字節(jié)是8位,32位/8=4個(gè)字節(jié)
**
NumPy數(shù)組形狀的操作
**
reshape和resize方法:
兩個(gè)方法都是用來(lái)修改數(shù)組形狀的,但是有一些不同:調(diào)用resize()相當(dāng)于C里面的引用,會(huì)導(dǎo)致原數(shù)組隨之改變
- reshape是將數(shù)組轉(zhuǎn)換成指定的形狀,然后返回轉(zhuǎn)換后的結(jié)果,對(duì)于原數(shù)組的形狀是不會(huì)發(fā)生改變的。調(diào)用方式:
a1 = np.random.randint(0,10,size=(3,4))
a2 = a1.reshape((2,6)) #將修改后的結(jié)果返回,不會(huì)影響原數(shù)組本身
- resize是將數(shù)組轉(zhuǎn)換成指定的形狀,會(huì)直接修改數(shù)組本身。并不會(huì)返回任何值。調(diào)用方式:
a1 = np.random.randint(0,10,size=(3,4))
a1.resize((2,6)) #a1本身發(fā)生了改變
flatten和ravel方法:
- flatten是將數(shù)組轉(zhuǎn)換為一維數(shù)組后,然后將這個(gè)拷貝返回回去,所以后續(xù)對(duì)這個(gè)返回值進(jìn)行修改不會(huì)影響之前的數(shù)組。
- ravel是將數(shù)組轉(zhuǎn)換為一維數(shù)組后,將這個(gè)視圖(可以理解為引用)返回回去,所以后續(xù)對(duì)這個(gè)返回值進(jìn)行修改會(huì)影響之前的數(shù)組。
x = np.array([[1, 2], [3, 4]])
x.flatten()[1] = 100 #此時(shí)的x[0]的位置元素還是1
x.ravel()[1] = 100 #此時(shí)x[0]的位置元素是100
**
不同數(shù)組的組合
**
vstack:
將數(shù)組按垂直方向進(jìn)行疊加。數(shù)組的列數(shù)必須相同才能疊加。
a1 = np.random.randint(0,10,size=(3,5))
a2 = np.random.randint(0,10,size=(1,5))
a3 = np.vstack([a1,a2])
hstack:
將數(shù)組按水平方向進(jìn)行疊加。
a1 = np.random.randint(0,10,size=(3,2))
a2 = np.random.randint(0,10,size=(3,1))
a3 = np.hstack([a1,a2])
concatenate([],axis):
將兩個(gè)數(shù)組進(jìn)行疊加,但是具體是按水平方向還是按垂直方向。則要看axis的參數(shù),如果axis=0,那么代表的是往垂直方向(一行一行的)疊加,如果axis=1,那么代表的是往水平方向(一列一列的)上疊加,如果axis=None,那么會(huì)將兩個(gè)數(shù)組組合成一個(gè)一維數(shù)組。需要注意的是,如果往水平方向上疊加,那么行必須相同,如果是往垂直方向疊加,那么列必須相同。
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6]])
np.concatenate((a, b), axis=0)
# 結(jié)果:
array([[1, 2],
[3, 4],
[5, 6]])
np.concatenate((a, b.T), axis=1)
# 結(jié)果:
array([[1, 2, 5],
[3, 4, 6]])
np.concatenate((a, b), axis=None)
# 結(jié)果:
array([1, 2, 3, 4, 5, 6])
**
數(shù)組的切割:
**
hsplit:
在垂直方向進(jìn)行切割。用于指定分割成幾列,可以使用數(shù)字來(lái)代表分成幾部分,也可以使用數(shù)組來(lái)代表分割的地方
a1 = np.arange(16.0).reshape(4, 4)
np.hsplit(a1,2) #分割成兩部分,把第0,1列和第3,4列分割開
>>> array([[ 0., 1.],
[ 4., 5.],
[ 8., 9.],
[12., 13.]]), array([[ 2., 3.],
[ 6., 7.],
[10., 11.],
[14., 15.]])]
np.hsplit(a1,[1,2]) #代表在下標(biāo)為1的地方切一刀,下標(biāo)為2的地方切一刀,分成三部分
>>> [array([[ 0.],
[ 4.],
[ 8.],
[12.]]), array([[ 1.],
[ 5.],
[ 9.],
[13.]]), array([[ 2., 3.],
[ 6., 7.],
[10., 11.],
[14., 15.]])]
vsplit:
在水平方向進(jìn)行切割。用于指定分割成幾行,可以使用數(shù)字來(lái)代表分成幾部分,也可以使用數(shù)組來(lái)代表分割的地方
np.vsplit(x,2) #代表按照行總共分成2個(gè)數(shù)組
>>> [array([[0., 1., 2., 3.],
[4., 5., 6., 7.]]), array([[ 8., 9., 10., 11.],
[12., 13., 14., 15.]])]
np.vsplit(x,(1,2)) #代表按照行進(jìn)行劃分,在下標(biāo)為1的地方和下標(biāo)為2的地方分割
>>> [array([[0., 1., 2., 3.]]),
array([[4., 5., 6., 7.]]),
array([[ 8., 9., 10., 11.],
[12., 13., 14., 15.]])]
plit/array_split(array,indicate_or_seciont,axis)
用于指定切割方式,在切割的時(shí)候需要指定是按照行還是按照列,axis=1代表按照列,axis=0代表按照行。
np.array_split(x,2,axis=0) #按照垂直方向切割成2部分
>>> [array([[0., 1., 2., 3.],
[4., 5., 6., 7.]]), array([[ 8., 9., 10., 11.],
[12., 13., 14., 15.]])]
數(shù)組(矩陣)轉(zhuǎn)置和軸對(duì)換:
numpy中的數(shù)組其實(shí)就是線性代數(shù)中的矩陣。ndarray有一個(gè)T屬性,可以返回這個(gè)數(shù)組的轉(zhuǎn)置的結(jié)果。
a1 = np.arange(0,24).reshape((4,6))
a2 = a1.T
print(a2)
另外還有一個(gè)方法叫做transpose,這個(gè)方法返回的是一個(gè)View,也即修改返回值(即引用),會(huì)影響到原來(lái)數(shù)組
a1 = np.arange(0,24).reshape((4,6))
a2 = a1.transpose()
索引和切片:
- 獲取某行的數(shù)據(jù)
# 如果是一維數(shù)組
a1 = np.arange(0,29)
print(a1[1]) #獲取下標(biāo)為1的元素
#如果是二維數(shù)組
a1 = np.arange(0,24).reshape((4,6))
print(a1[1]) #獲取下標(biāo)為1的行的數(shù)據(jù)
- 獲取某行某列的數(shù)據(jù)
a1 = np.arange(0,24).reshape((4,6))
print(a1[1,1]) #獲取1行1列的數(shù)據(jù)
print(a1[0:2,0:2]) #獲取0-1行的0-1列的數(shù)據(jù)(左閉右開)
print(a1[[1,2],[2,3]]) #獲取(1,2)和(2,3)的兩個(gè)數(shù)據(jù),這也叫花式索引
布爾索引:
a1 = np.arange(0,24).reshape((4,6))
print(a1<10) #會(huì)返回一個(gè)新的數(shù)組,這個(gè)數(shù)組中的值全部都是bool類型
> [[ True True True True True True]
[ True True True True False False]
[False False False False False False]
[False False False False False False]]
將a1數(shù)組中所有小于10的數(shù)據(jù)全部都提取出來(lái)。那么可以使用以下方式實(shí)現(xiàn):
a1 = np.arange(0,24).reshape((4,6))
a2 = a1 < 10
print(a1[a2]) #這樣就會(huì)在a1中把a(bǔ)2中為True的元素對(duì)應(yīng)的位置的值提取出來(lái)
其中布爾運(yùn)算可以有!=、==、>、<、>=、<=以及&(與)和|(或)
a1 = np.arange(0,24).reshape((4,6))
a2 = a1[(a1 < 5) | (a1 > 10)]
print(a2)
值的替換:
利用索引,也可以做一些值的替換。把滿足條件的位置的值替換成其他的值。
a1 = np.arange(0,24).reshape((4,6))
a1[3] = 0 #將第三行的所有值都替換成0
print(a1)
也可以使用條件索引來(lái)實(shí)現(xiàn):文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-484691.html
a1 = np.arange(0,24).reshape((4,6))
a1[a1 < 5] = 0 #將小于5的所有值全部都替換成0
print(a1)
還可以使用函數(shù)來(lái)實(shí)現(xiàn):文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-484691.html
# where函數(shù):
a1 = np.arange(0,24).reshape((4,6))
a2 = np.where(a1 < 10,1,0) #把a(bǔ)1中所有小于10的數(shù)全部變成1,其余的變成0
print(a2)
到了這里,關(guān)于NumPy數(shù)組基本用法的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!