Python的第三方擴(kuò)展庫(kù)趾徽,是其他數(shù)據(jù)分析模塊的基礎(chǔ)朽缎,主要用于數(shù)組惨远、矩陣計(jì)算(比列表快得多)等方面
安裝
pip install numpy
常用方法
array()
創(chuàng)建數(shù)組,舉例:
創(chuàng)建一維數(shù)組:numpy.array([x,y,...])
二維數(shù)組:numpy.array([[x,y...],[x,y...],[x,y...])
注:
創(chuàng)建的數(shù)組如果想看格式(幾行幾列)话肖,就通過(guò)array.shape
來(lái)看就行了北秽,要知道是幾維的數(shù)據(jù),可以通過(guò)array.ndim
查看最筒,舉例:
>>> z = np.array([[1,2],[3,4],[5,6]])
>>> z.ndim
2
#2維
>>> z.shape
(3, 2)
#3行兩列
>>> m = np.array([1,2])
>>> m.shape
(2,)
#1行兩列
注2:
數(shù)組創(chuàng)建后大小就固定了贺氓,所以如果想要進(jìn)行增刪改查則可以參考如下方法:
- 增:使用
tile()
擴(kuò)展、vstack()
合并床蜘、轉(zhuǎn)成列表操作再轉(zhuǎn)回來(lái)(參考后面) - 刪:可以直接像
a=a[0]
辙培,那么就只有一行了、分片操作 - 改:直接改
- 查:直接查邢锯,可以參考后面的數(shù)組切片
舉例:
>>> a = np.array([1,2,3,4])
>>> np.tile(a, 2) #此時(shí)第二個(gè)參數(shù)相當(dāng)于(1,2)扬蕊,即擴(kuò)展成1行2列(x軸變成原來(lái)2倍)
array([1, 2, 3, 4, 1, 2, 3, 4])
數(shù)組操作
對(duì)數(shù)組的操作都是通過(guò)依次對(duì)其中的元素進(jìn)行相同操作,舉例:
>>> x = np.array([-1,0,1,2,3])
>>> x
array([-1, 0, 1, 2, 3])
>>> x > 1 #依次判斷丹擎,若滿足條件則True尾抑,否則False
array([False, False, False, True, True])
>>> x * 2 #依次對(duì)所有元素乘2
array([-2, 0, 2, 4, 6])
>>> x = np.array([[1,2],[3,4]])
>>> x[x>2] = 0
# 將數(shù)組中大于2的值都置0
>>> x
array([[1, 2],
[0, 0]])
>>> x = np.arange(0, 5)
>>> x
array([0, 1, 2, 3, 4])
>>> y = x[:, np.newaxis]
# 把x轉(zhuǎn)成二維就是y
>>> y
array([[0],
[1],
[2],
[3],
[4]])
>>> x + y
# 對(duì)于兩個(gè)不是相同格式的數(shù)據(jù)添加,會(huì)自動(dòng)拓展成兩個(gè)都合適的維度進(jìn)行計(jì)算蒂培,后面會(huì)還原計(jì)算過(guò)程
array([[0, 1, 2, 3, 4],
[1, 2, 3, 4, 5],
[2, 3, 4, 5, 6],
[3, 4, 5, 6, 7],
[4, 5, 6, 7, 8]])
>>> x1 = np.tile(x, (5, 1))
# 把x的行復(fù)制成原來(lái)的5倍
>>> x1
array([[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4]])
>>> y1 = np.tile(y, (1, 5))
# 把y的列復(fù)制成原來(lái)的5倍
>>> y1
array([[0, 0, 0, 0, 0],
[1, 1, 1, 1, 1],
[2, 2, 2, 2, 2],
[3, 3, 3, 3, 3],
[4, 4, 4, 4, 4]])
>>> x1 + y1
# 可以看到結(jié)果和之前是一樣的
array([[0, 1, 2, 3, 4],
[1, 2, 3, 4, 5],
[2, 3, 4, 5, 6],
[3, 4, 5, 6, 7],
[4, 5, 6, 7, 8]])
注:
數(shù)組是可以定義里面所有的類型統(tǒng)一的(通過(guò)astype
方法或者有些數(shù)據(jù)讀取自帶類型再愈,比如圖片讀取默認(rèn)是np.uint8
),所以在對(duì)數(shù)組進(jìn)行操作前需要判斷數(shù)據(jù)類型是否符合要求或者需要轉(zhuǎn)型护戳,否則將可能發(fā)生數(shù)據(jù)被自動(dòng)轉(zhuǎn)型或者操作失敗等問(wèn)題翎冲,舉例:
>>> x = np.array([[-1,0,1], [2,3,4]], np.int8)
# 數(shù)據(jù)類型是int8:-256~255
>>> x[1, :] = [1., 2., 300.]
>>> x
array([[-1, 0, 1],
[ 1, 2, 44]], dtype=int8)
# 300超過(guò)邊界,被自動(dòng)轉(zhuǎn)成44(300-255媳荒,從0開(kāi)始)
數(shù)組索引
數(shù)組除了可以通過(guò)輸入對(duì)應(yīng)行列或者切片(后面會(huì)介紹)進(jìn)行索引以外抗悍,也可以輸入一個(gè)列表進(jìn)行批量指定索引,舉例:
>>> x = np.array([-1,0,1,2,3])
>>> x[[1,2,4]]
# 索引第2,3,5個(gè)數(shù)據(jù)
array([0, 1, 3])
注:
輸入列表是批量索引肺樟,但輸入的如果是元組檐春,則是指定坐標(biāo)索引逻淌,舉例:
>>> x = np.array([[1,2,3], [4,5,6], [7,8,9]])
>>> x
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
>>> x[[0,1]]
# 輸入列表么伯,代表要第一行和第二行
array([[1, 2, 3],
[4, 5, 6]])
>>> x[(0,1)]
# 輸入元組,代表要第一行第二列的數(shù)據(jù)
2
>>> x[(0,1), (1,1)]
# 要坐標(biāo)為0,1和1,1的數(shù)據(jù)
array([2, 5])
>>> x[(0,1,1)]
# 用元組默認(rèn)是當(dāng)成一組坐標(biāo)卡儒,因此必須是2個(gè)值成對(duì)出現(xiàn)田柔,這里輸入3個(gè)俐巴,而數(shù)據(jù)是二維,自然就報(bào)錯(cuò)了
Traceback (most recent call last):
File "<pyshell#35>", line 1, in <module>
x[(0,1,1)]
IndexError: too many indices for array
邏輯操作
從前面的代碼可以知道數(shù)組可以進(jìn)行整體的邏輯判斷硬爆,但是前面的示例都是單個(gè)條件判斷欣舵,如果想進(jìn)行多個(gè)判斷后再進(jìn)行與或異或這些操作,可以使用logical_and()
等這類邏輯操作方法缀磕,舉例:
>>> a = np.array([[1,2,3], [1,2,""], [1,2,None]])
>>> np.logical_and.reduce([a!="", a!=None])
array([[ True, True, True],
[ True, True, False],
[ True, True, False]])
# 同時(shí)判斷值不為空字符串和None
上面的方法只能對(duì)兩個(gè)條件進(jìn)行判斷缘圈,多個(gè)條件的情況參考:
http://www.reibang.com/p/1146b51ae6de
sort()
排序,正常排袜蚕,遇到無(wú)法排序的放最后糟把,舉例:
>>> x = np.array([1,3,2,'a',5])
>>> x
array(['1', '3', '2', 'a', '5'], dtype='<U11') #排序前
>>> x.sort()
>>> x
array(['1', '2', '3', '5', 'a'], dtype='<U11') #排序后
注:
二維數(shù)組排序只排每一行里面的,其他行之間互不干擾
max()
求最大值牲剃,如果在二維數(shù)組中遣疯,每行的列數(shù)相等,那么最大值就是所有元素里最大的凿傅,舉例:
>>> x = np.array([[1,2,3,5],[1,2,0,0],[5,8,23,1]])
>>> x.max()
23
但如果每行列數(shù)不同缠犀,返回的就是數(shù)開(kāi)頭最大的那一行(假如第一個(gè)一樣,再比第二個(gè)...)聪舒,舉例:
>>> x = np.array([[3,2,1,4,10],[1,2,0,0],[3,6,9,1]])
>>> x.max()
[3, 6, 9, 1]
注:
最小值min()
辨液,平均值是mean()
,加權(quán)平均值是average()
过椎,標(biāo)準(zhǔn)差是std()
[:]
數(shù)組切片室梅,參考列表,舉例:
>>> b = np.array([1,2,3,4,5])
>>> b[1:3]
array([2, 3])
>>> a = np.array(([1,2,3,4],[5,6,7,8],[9,10,11,12]))
>>> a[1:]
array([[ 5, 6, 7, 8],
[ 9, 10, 11, 12]])
>>> a[:][1] #切出所有行疚宇,取第2個(gè)
array([5, 6, 7, 8])
>>> a[:][1:] #切出所有行亡鼠,取第二個(gè)2到最后一個(gè)
array([[ 5, 6, 7, 8],
[ 9, 10, 11, 12]])
可以看出上面只能切出行而不能切分列(其將行看作整體來(lái)切分),所以推薦使用下面的針對(duì)數(shù)組特殊的切片方法來(lái)切分行列敷待,格式:[:,:]
间涵,在一個(gè)括號(hào)里寫(xiě)分片,逗號(hào)分隔行列榜揖,舉例:
>>> a = np.array(([1,2,3,4],[5,6,7,8],[9,10,11,12]))
>>> a[1:, 1] #取第二勾哩、三行的第二列數(shù)據(jù)
array([ 6, 10])
>>> a[:, 0:3] #取所有行的第一列到第三列數(shù)據(jù)
array([[ 1, 2, 3],
[ 5, 6, 7],
[ 9, 10, 11]])
...
省略號(hào)在數(shù)組當(dāng)中也是可以使用的,也是切片的一種举哟,但有所不同思劳,舉例:
>>> x = np.array([[[1],[2],[3]], [[4],[5],[6]]])
>>> x.shape
(2, 3, 1)
>>> x[...,0]
array([[1, 2, 3],
[4, 5, 6]])
>>> x[:,0]
# 發(fā)現(xiàn)和x[...,0]結(jié)果不一樣
array([[1],
[4]])
>>> x[:,:,0]
# 和x[...,0]結(jié)果一樣
array([[1, 2, 3],
[4, 5, 6]])
從上面可以看出...
的切片效果就是將所有...
以外沒(méi)設(shè)置范圍的地方都調(diào)整為:
random.randint(x,y,n)
隨機(jī)數(shù)整數(shù)生成,前兩個(gè)參數(shù)代表范圍妨猩,第三個(gè)為可選潜叛,表示生成格式或者數(shù)量,比如:
>>> np.random.randint(1,10,10)
# 隨機(jī)生成10個(gè)1到10的隨機(jī)數(shù)
array([ 6, 5, 7, 6, 5, 4, 9, 9, 10, 5])
>>> np.random.randint(0, 256, (100, 80))
# 隨機(jī)生成格式為100行80列的數(shù)組
array([[ 46, 100, 98, ..., 56, 97, 172],
[ 60, 141, 217, ..., 208, 157, 70],
[189, 200, 13, ..., 193, 95, 80],
...,
[ 88, 155, 253, ..., 183, 139, 182],
[ 24, 101, 117, ..., 103, 30, 77],
[ 88, 236, 35, ..., 47, 211, 189]])
上面那個(gè)是生成整數(shù)的隨機(jī)數(shù),還有rand()
用來(lái)生成0到1之間的隨機(jī)數(shù)威兜,中間可以加參數(shù)代表生成幾個(gè)销斟,舉例:
>>> np.random.rand(10) #生成10個(gè)0-1的隨機(jī)數(shù)
array([0.42462596, 0.0985224 , 0.22108224, 0.46230285, 0.40928969,
0.54201574, 0.88982411, 0.8450716 , 0.21384846, 0.38896833])
random.random.normal(μ,σ,n)
生成一堆符合正態(tài)分布的數(shù),第一個(gè)參數(shù)是均值椒舵,第二個(gè)參數(shù)是標(biāo)準(zhǔn)差蚂踊,第三個(gè)參數(shù)是生成數(shù),舉例:
>>> a = np.random.normal(0,1,10)
>>> a
array([-0.55491277, -1.1161704 , 0.97514814, 1.99653332, -0.08500584,
0.64075696, 1.96409159, -0.11636198, 0.52605946, 0.90563603])
>>> a.mean()
0.513577451404013
>>> a.std()
0.9612030098851562
#當(dāng)生成的數(shù)多了笔宿,精度自然也會(huì)提高
更多numpy.random
參考:
http://www.mamicode.com/info-detail-507676.html
arange()
類似range
犁钟,前兩個(gè)參數(shù)代表范圍,第三個(gè)代表階值類似range泼橘,舉例:
>>> np.arange(10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> np.arange(1,10,2)
array([1, 3, 5, 7, 9])
注:
發(fā)現(xiàn)了嗎特纤,像python自帶的random
、range
雖然和這些幾乎一樣侥加,但有個(gè)區(qū)別就是numpy下的這幾個(gè)方法生成的都是array
類型的捧存,原來(lái)那些都是list
類型
concatenate()
將數(shù)組整合在一起,數(shù)組不像列表那樣可以直接加著整合担败,比如列表里:
>>> a = [1,2,3]
>>> b = [4,5,6]
>>> a+b
[1, 2, 3, 4, 5, 6]
>>> a*2
[1, 2, 3, 1, 2, 3]
從上面可以看出對(duì)列表進(jìn)行運(yùn)算都是把列表當(dāng)成整體來(lái)運(yùn)算昔穴,而對(duì)于數(shù)組里:
>>> a = np.array([1,2,3])
>>> b = np.array([4,5,6])
>>> a + b
array([5, 7, 9])
>>> a * 2
array([2, 4, 6])
可以看出對(duì)數(shù)組的運(yùn)算是對(duì)他里面的值進(jìn)行運(yùn)算,因此要對(duì)數(shù)組進(jìn)行列表那樣的操作提前,就需要用上面那個(gè)方法吗货,對(duì)上面的a、b舉例:
>>> np.concatenate((a, b)) #以元組形式傳入
array([1, 2, 3, 4, 5, 6])
sum()
計(jì)算總和狈网,舉例:
>>> np.sum([1,2,3])
6
上面的是對(duì)行內(nèi)相加宙搬,如果是多行數(shù)據(jù),并且希望是各行的對(duì)應(yīng)數(shù)據(jù)之間相加拓哺,可以設(shè)置參數(shù):axis=0
(默認(rèn)為1勇垛,即行內(nèi)相加),舉例:
>>> a = np.array([[1,2,3,4], [5,6,7,8], [1, 2, 3, 4]])
>>> a.sum() #全部數(shù)據(jù)之和
46
>>> a.sum(axis=0) #各行對(duì)應(yīng)數(shù)據(jù)之和
array([ 7, 10, 13, 16])
注:
其他計(jì)算操作如:求對(duì)數(shù)用np.log()
士鸥,向上取整用np.ceil()
闲孤,比如3.1就變成4
unique()
去重,舉例:
>>> np.unique([1,2,3,1,2,3,5,6,4])
array([1, 2, 3, 4, 5, 6])
>>> np.unique(np.array([1,2,3,1,2,3,5,6,4])) #對(duì)數(shù)組烤礁、列表都可以讼积,但最終都是變成數(shù)組
array([1, 2, 3, 4, 5, 6])
drop()
丟棄
fillna()
對(duì)丟失值的填充
tile()
復(fù)制擴(kuò)展數(shù)組,有兩個(gè)參數(shù)脚仔,第一個(gè)是要復(fù)制擴(kuò)展的數(shù)組勤众,第二個(gè)參數(shù)是個(gè)元組,意思是變成幾行幾列鲤脏,舉例:
>>> a = np.array([1,2,3,4])
>>> np.tile(a, 2) #此時(shí)第二個(gè)參數(shù)相當(dāng)于(1,2)们颜,即擴(kuò)展成1行2列(x軸變成原來(lái)2倍)
array([1, 2, 3, 4, 1, 2, 3, 4])
第二個(gè)參數(shù)的元組有幾位,就代表幾維,一般都是用二維掌桩,即兩個(gè)值,代表幾行幾列姑食,在列上擴(kuò)展舉例1:
>>> np.tile(a, (2, 1)) #擴(kuò)展成2行1列
array([[1, 2, 3, 4],
[1, 2, 3, 4]])
其還能擴(kuò)展到更多維波岛,如三維舉例:
>>> np.tile(a, (3, 2, 1)) #在三維下,分3組音半,每組2行1列
array([[[1, 2, 3, 4],
[1, 2, 3, 4]],
[[1, 2, 3, 4],
[1, 2, 3, 4]],
[[1, 2, 3, 4],
[1, 2, 3, 4]]])
四維舉例:
>>> np.tile(a, (2, 3, 3, 2)) #在4維下则拷,分2組,每組3個(gè)曹鸠,每個(gè)3行2列
array([[[[1, 2, 3, 4, 1, 2, 3, 4],
[1, 2, 3, 4, 1, 2, 3, 4],
[1, 2, 3, 4, 1, 2, 3, 4]],
[[1, 2, 3, 4, 1, 2, 3, 4],
[1, 2, 3, 4, 1, 2, 3, 4],
[1, 2, 3, 4, 1, 2, 3, 4]],
[[1, 2, 3, 4, 1, 2, 3, 4],
[1, 2, 3, 4, 1, 2, 3, 4],
[1, 2, 3, 4, 1, 2, 3, 4]]],
[[[1, 2, 3, 4, 1, 2, 3, 4],
[1, 2, 3, 4, 1, 2, 3, 4],
[1, 2, 3, 4, 1, 2, 3, 4]],
[[1, 2, 3, 4, 1, 2, 3, 4],
[1, 2, 3, 4, 1, 2, 3, 4],
[1, 2, 3, 4, 1, 2, 3, 4]],
[[1, 2, 3, 4, 1, 2, 3, 4],
[1, 2, 3, 4, 1, 2, 3, 4],
[1, 2, 3, 4, 1, 2, 3, 4]]]])
發(fā)現(xiàn)了嗎煌茬,可以這樣理解第二個(gè)參數(shù),那就是元組的最后兩個(gè)數(shù)代表變成原來(lái)的幾行幾列彻桃,前面的數(shù)都是分多少組多少個(gè)坛善,比如三維的3個(gè)數(shù)分別代表:幾組幾行幾列;四維分別代表:幾組幾個(gè)幾行幾列邻眷;五維:幾組幾個(gè)幾塊幾行幾列眠屎;六…(單位是瞎編的,但是意思沒(méi)錯(cuò))
zero()
生成一個(gè)自定義大小值全為0的數(shù)組肆饶,傳入?yún)?shù)是一個(gè)列表或元組改衩,代表幾行幾列,舉例:
>>> np.zeros([2,5])
array([[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.]])
其傳入的列表也可以是多維的驯镊,比如:
>>> np.zeros([2,2,5]) #2組葫督,每組2行5列
array([[[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.]],
[[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.]]])
多維的用法和tile()
函數(shù)的基本一樣,參考上面即可
注:
numpy里還有生成一個(gè)自定義大小值全為1
的數(shù)組放方法:ones()
板惑,還有值都為空的數(shù)組:empty()
vstack()
/hstack()
將兩個(gè)數(shù)組在垂直/水平方向合并橄镜,舉例:
>>> a = np.array([1,2,3,4])
>>> b = np.array([5,6,7,8])
>>> np.hstack((a,b))
array([1, 2, 3, 4, 5, 6, 7, 8])
>>> np.vstack((a,b))
array([[1, 2, 3, 4],
[5, 6, 7, 8]])
注:
如果是對(duì)當(dāng)前數(shù)組自己進(jìn)行垂直/水平方向合并,則相當(dāng)于轉(zhuǎn)成二維或者一維冯乘,舉例:
>>> a = np.array([1,2,3,4])
>>> b = np.array([5,6,7,8])
>>> np.hstack(a)
array([1, 2, 3, 4])
>>> np.vstack(a)
array([[1],
[2],
[3],
[4]])
stack
也是把數(shù)組堆疊在一起蛉鹿,可以指定維度,默認(rèn)維度是0往湿,,即把數(shù)組看作一個(gè)整體堆疊在后面妖异,和concatenate
/vstack
/hstack
的區(qū)別參考:
https://cloud.tencent.com/developer/article/1378491
https://www.cnblogs.com/nkh222/p/8932369.html
舉例:
>>> a = np.array([[1, 2, 3], [4, 5, 6]])
>>> a
array([[1, 2, 3],
[4, 5, 6]])
>>> b = a
>>> np.vstack((a, b))
array([[1, 2, 3],
[4, 5, 6],
[1, 2, 3],
[4, 5, 6]])
>>> np.hstack((a, b))
array([[1, 2, 3, 1, 2, 3],
[4, 5, 6, 4, 5, 6]])
# 整個(gè)拼在右邊
>>> np.concatenate((a, b))
array([[1, 2, 3],
[4, 5, 6],
[1, 2, 3],
[4, 5, 6]])
>>> np.stack((a, b))
array([[[1, 2, 3],
[4, 5, 6]],
[[1, 2, 3],
[4, 5, 6]]])
stack
的第二個(gè)參數(shù),用于設(shè)置在第幾個(gè)維度進(jìn)行堆疊领追,舉例:
>>> a = np.array([[1, 2, 3], [4, 5, 6]])
>>> a
array([[1, 2, 3],
[4, 5, 6]])
>>> a.shape
(2, 3)
>>> b = a
>>> np.stack((a, b), axis=0)
array([[[1, 2, 3],
[4, 5, 6]],
[[1, 2, 3],
[4, 5, 6]]])
# 在第0個(gè)維度堆疊他膳,相當(dāng)于新建一個(gè)維度
>>> np.stack((a, b), axis=0).shape
(2, 2, 3)
# 所以數(shù)據(jù)a從(2, 3) -> (1, 2, 3) -> (2, 2, 3)
>>> np.stack((a, b), axis=1)
array([[[1, 2, 3],
[1, 2, 3]],
[[4, 5, 6],
[4, 5, 6]]])
>>> np.stack((a, b), axis=1).shape
(2, 2, 3)
# 在第1個(gè)維度進(jìn)行堆疊,所以數(shù)據(jù)a從(2, 3) -> (2, 1, 3) -> (2, 2, 3)
>>> np.stack((a, b), axis=2)
array([[[1, 1],
[2, 2],
[3, 3]],
[[4, 4],
[5, 5],
[6, 6]]])
>>> np.stack((a, b), axis=2).shape
(2, 3, 2)
# 在第2個(gè)維度進(jìn)行堆疊绒窑,所以數(shù)據(jù)從(2, 3) -> (2, 3, 1) -> (2, 3, 2)
>>> np.stack((a, b), axis=-1)
array([[[1, 1],
[2, 2],
[3, 3]],
[[4, 4],
[5, 5],
[6, 6]]])
# -1代表在最后一個(gè)維度進(jìn)行堆疊棕孙,所以看出和2的時(shí)候結(jié)果一樣
linspace()
生成一個(gè)等差數(shù)列,舉例:
>>> np.linspace(-1,1,5, dtype=np.float32) # -1到1分成5份的等差數(shù)列
array([-1. , -0.5, 0. , 0.5, 1. ], dtype=float32)
newaxis
如果直接輸出,你會(huì)發(fā)現(xiàn)他就是None
(源碼里就是newaxis = None
)蟀俊,但是他常被用來(lái)添加一個(gè)新的維度钦铺,比如一維向量變二維矩陣,二維則變?nèi)S等等肢预,可能因?yàn)?code>None在這里有這個(gè)功能矛洞,因?yàn)闉榱朔奖汩喿x程序而設(shè)置了一個(gè)別名,使用舉例:
>>> np.newaxis == None # 可以發(fā)現(xiàn)他就是None
True
>>> x = np.array([1,2,3,4])
>>> x
array([1, 2, 3, 4])
>>> x.shape # 可以看出是一維的向量
(4,)
>>> x[:, np.newaxis]
array([[1],
[2],
[3],
[4]])
>>> x[:, np.newaxis].shape # 變成二維了
(4, 1)
sin()
/cos()
正弦/余弦函數(shù)烫映,舉例:
>>> np.sin(math.pi/6)
0.49999999999999994
astype()
類型轉(zhuǎn)換沼本,舉例:
>>> y
array([False, False, False, True, True])
>>> y.astype(np.int) #將bool類型轉(zhuǎn)int
array([0, 0, 0, 1, 1])
數(shù)據(jù)類型范圍:
這里列一些常用數(shù)據(jù)類型及對(duì)應(yīng)范圍:
NaN 沒(méi)有填東西,也就是空
inf 無(wú)窮大
int8 -128~127
uint8 0~256
int16 32768~32767
uint16 0~65535
int/int32 -2^32~2^32-1
float16 半精度浮點(diǎn)型
float32 單精度浮點(diǎn)型
float_/float64 雙精度浮點(diǎn)型
更多參考:https://www.runoob.com/numpy/numpy-dtype.html
dot()
矩陣相乘锭沟,舉例:
>>> x = np.array([[1,2],[3,4]])
>>> y = np.array([[1,1],[1,1]])
>>> np.dot(x, y)
array([[3, 3],
[7, 7]])
也可以通過(guò)python內(nèi)置的@
符號(hào)實(shí)現(xiàn)矩陣相乘抽兆,舉例:
>>> x = np.array([[1,2],[3,4]])
>>> y = np.array([[1,1],[1,1]])
>>> x@y
array([[3, 3],
[7, 7]])
T
矩陣轉(zhuǎn)置,即x和y對(duì)調(diào)過(guò)來(lái)族淮,舉例:
>>> x = np.array([[1,2], [0, 1]])
>>> x
array([[1, 2],
[0, 1]])
>>> x.T
array([[1, 0],
[2, 1]])
mat()
定義矩陣辫红,雖然array
也能夠定義矩陣,但并不是真正的矩陣祝辣,只是可以定義矩陣的形狀厉熟,因此也缺少了一些矩陣專門(mén)有的方法,比如求逆矩陣(I
屬性實(shí)現(xiàn))较幌,舉例:
>>> x = np.mat([[1,2], [0, 1]])
>>> x
matrix([[1, 2],
[0, 1]])
>>> x.I
matrix([[ 1., -2.],
[ 0., 1.]])
>>> x @ x.I
# 可以看到相乘結(jié)果為1001揍瑟,也就證明是逆矩陣了
matrix([[1., 0.],
[0., 1.]])
argmax()
/argmin()
索引維度當(dāng)中最大值/最小值,舉例:
>>> x = np.array([[0.1, 0.6, 0.1], [0.3, 0.1, 0.6],[0.2, 0.5, 0.3], [0.8, 0.1, 0.1]])
>>> y = np.argmax(x) #索引整個(gè)數(shù)組最大元素
>>> y
9
#第10個(gè)最大乍炉,為0.8
>>> y = np.argmax(x, axis=1) #在每個(gè)維度(沿著一維方向)里面索引最大值
>>> y
array([1, 2, 1, 0], dtype=int32)
#每個(gè)維度最大的分別是0.6,0.6,0.5,0.8绢片,位置分別是1,2,1,0
argsort()
沿著索引維度從小到大排序,返回的是排序后的索引岛琼,舉例:
>>> x = np.array([2,1,5,4,3])
>>> x.argsort()
# 可以看到從小到大排序的索引
array([1, 0, 4, 3, 2], dtype=int64)
>>> x[x.argsort()]
# 通過(guò)索引查看對(duì)應(yīng)排序的值
array([1, 2, 3, 4, 5])
>>> (-x).argsort()
# 如果想要從大到小排序底循,可以乘個(gè)負(fù)號(hào)
array([2, 3, 4, 0, 1], dtype=int64)
arctan
計(jì)算某個(gè)點(diǎn)的正切,舉例:
>>> np.arctan(2/1)
1.1071487177940904
如果想知道對(duì)應(yīng)的角度就可以乘以180/π
槐瑞,也可以用numpy下的rad2deg()
方法熙涤,舉例:
>>> np.arctan(2/1) * 180 / np.pi
63.43494882292201
>>> np.rad2deg(np.arctan(2/1))
63.43494882292201
# 可以看出結(jié)果一樣
arctan2
和上面的很像,也是計(jì)算某個(gè)點(diǎn)的正切困檩。但前者是計(jì)算某個(gè)點(diǎn)在正切曲線上對(duì)應(yīng)的值祠挫,而這個(gè)則是計(jì)算某個(gè)點(diǎn)相對(duì)坐標(biāo)(0, 0)的正切值,傳入前兩個(gè)參數(shù)分別是:y和x(記住第一個(gè)參數(shù)是y不是x)悼沿,舉例:
>>> np.arctan2(2, 1) * 180 / np.pi
# 坐標(biāo)(1, 2)的正切值等舔,可以看出和np.arctan(2/1)一樣
63.43494882292201
>>> np.arctan2(-2, 1) * 180 / np.pi
# 坐標(biāo)(1, -2)的正切值,想象一下糟趾,是在x軸下方慌植,但是角度一樣甚牲,因此為負(fù)
-63.43494882292201
>>> np.arctan2(2, -1) * 180 / np.pi
# 坐標(biāo)(-1, 2)的正切值
116.56505117707799
reshape
改變數(shù)組的形狀,其中-1
代表對(duì)剩下的進(jìn)行合并處理蝶柿,舉例:
>>> a = np.random.randint(0, 255, (50, 50, 50))
>>> a.shape
>>> a.reshape(500, 25, 10).shape
# 轉(zhuǎn)成(500, 25, 10)
(500, 25, 10)
>>> a.reshape(50, -1).shape
# 轉(zhuǎn)成(50, 剩下的)
(50, 2500)
>>> a.reshape(500, 10, -1).shape
# 轉(zhuǎn)成(500, 10, 剩下的)
(500, 10, 25)
clip
限制數(shù)組范圍丈钙,舉例:
>>> x = np.array([i for i in range(10)])
>>> x
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> np.clip(x, 0, 5)
# 限制數(shù)組x范圍在0~5
array([0, 1, 2, 3, 4, 5, 5, 5, 5, 5])
>>> x = np.array([i+.1 for i in range(10)])
>>> x
array([0.1, 1.1, 2.1, 3.1, 4.1, 5.1, 6.1, 7.1, 8.1, 9.1])
>>> np.clip(x, 0., 5.)
# 對(duì)于超過(guò)范圍的數(shù)進(jìn)行邊界值處理,其他值不會(huì)處理
array([0.1, 1.1, 2.1, 3.1, 4.1, 5. , 5. , 5. , 5. , 5. ])
fabs
對(duì)數(shù)組的值去絕對(duì)值交汤,舉例:
>>> x = np.array([i for i in range(0, -10, -1)])
>>> x
array([ 0, -1, -2, -3, -4, -5, -6, -7, -8, -9])
>>> np.fabs(x)
array([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])
prod
計(jì)算階乘雏赦,舉例:
>>> np.prod(np.array([1,2,3,4]))
# 1*2*3*4
24
cum開(kāi)頭的方法
比如cumsum
,可以知道sum
是計(jì)算總和蜻展,那么cumsum
返回的就是從第一個(gè)到第n個(gè)數(shù)里第n次進(jìn)行操作的結(jié)果,舉例:
>>> np.cumsum(np.array([1,2,3,4]))
# 1, 1+2, 1+2+3, 1+2+3+4
array([ 1, 3, 6, 10], dtype=int32)
>>> np.cumprod(np.array([1,2,3,4]))
array([ 1, 2, 6, 24], dtype=int32)
浮點(diǎn)數(shù)轉(zhuǎn)換整數(shù)
參考:https://blog.csdn.net/sinat_34072381/article/details/84567523`
nonzero
返回所有不為0的數(shù)的索引邀摆,舉例:
>>> np.nonzero(np.array([1,2,3,0,-1,0]))
# 第0纵顾、1、2栋盹、4個(gè)數(shù)不為0
(array([0, 1, 2, 4], dtype=int64),)
>>> x = np.array([[1,0,3], [4,5,0]])
>>> np.nonzero(x)
# 返回2個(gè)數(shù)組施逾,第一個(gè)數(shù)組代表行的索引,第二個(gè)代表列的索引例获,比如這里就是:
# 0行0列汉额、0行2列、1行0列榨汤、1行1列的都不為0蠕搜,這樣也方便我們索引數(shù)據(jù)
(array([0, 0, 1, 1], dtype=int64), array([0, 2, 0, 1], dtype=int64))
>>> x[np.nonzero(x)]
# 可以看到返回所有的非0數(shù)據(jù)
array([1, 3, 4, 5])
pad
填充數(shù)組,舉例:
>>> x = np.array([1,2,3])
>>> x
array([1, 2, 3])
>>> np.pad(x, (1,0), 'constant')
# 在左邊添加一個(gè)0
array([0, 1, 2, 3])
>>> np.pad(x, (1,2), 'constant')
# 在左邊添加1個(gè)0收壕,右邊添加2個(gè)0
array([0, 1, 2, 3, 0, 0])
>>> np.pad(x, (1,2), 'mean')
# 在左邊添加1個(gè)平均值妓灌,右邊添加2個(gè)平均值
array([2, 1, 2, 3, 2, 2])
>>> np.pad(x, (1,2), 'edge')
# 填充邊緣值
array([1, 1, 2, 3, 3, 3])
>>> y = np.random.rand(2, 3)
>>> y
array([[0.47236851, 0.1362846 , 0.16687831],
[0.57028361, 0.22399912, 0.49424253]])
>>> np.pad(y, (1, 1), 'constant')
# 對(duì)二維數(shù)據(jù)填充,如果只傳入2個(gè)值蜜宪,那么第一個(gè)默認(rèn)是左邊和上邊的填充虫埂,第二個(gè)是右邊和下邊的填充
# 可以看出四邊都填充了0
array([[0. , 0. , 0. , 0. , 0. ],
[0. , 0.47236851, 0.1362846 , 0.16687831, 0. ],
[0. , 0.57028361, 0.22399912, 0.49424253, 0. ],
[0. , 0. , 0. , 0. , 0. ]])
>>> np.pad(y, (1, 0), 'constant')
# 就左邊和上邊填充0
array([[0. , 0. , 0. , 0. ],
[0. , 0.47236851, 0.1362846 , 0.16687831],
[0. , 0.57028361, 0.22399912, 0.49424253]])
>>> np.pad(y, ((0, 1), (1, 1)), 'constant')
# 如果希望上下左右填充的維度都自己控制,那么就傳入2個(gè)元組圃验,依次代表上下左右
# 可以看到這里就上面沒(méi)填充
array([[0. , 0.47236851, 0.1362846 , 0.16687831, 0. ],
[0. , 0.57028361, 0.22399912, 0.49424253, 0. ],
[0. , 0. , 0. , 0. , 0. ]])
>>> np.pad(y, ((0, 1), (0, 1)), 'constant')
# 填充右下
array([[0.47236851, 0.1362846 , 0.16687831, 0. ],
[0.57028361, 0.22399912, 0.49424253, 0. ],
[0. , 0. , 0. , 0. ]])
更多參考:https://blog.csdn.net/qq_36332685/article/details/78803622
打印數(shù)組顯示省略問(wèn)題
numpy中一般對(duì)于數(shù)組超過(guò)一定大小掉伏,就會(huì)以省略號(hào)形式顯示,因此為了解決該問(wèn)題澳窑,可以通過(guò)np.set_printoptions(threshold=行數(shù))
設(shè)置超過(guò)某個(gè)行數(shù)才以省略形式打印斧散,舉例:
>>> np.set_printoptions(threshold=10)
# 超過(guò)10行就省略號(hào)展示
>>> np.array([[[i] for i in range(100)]])
array([[[ 0],
[ 1],
[ 2],
...,
[97],
[98],
[99]]])
>>> np.set_printoptions(threshold=100)
# 超過(guò)100行...
>>> np.array([[[i] for i in range(100)]])
# 此處省略100行...
>>> np.set_printoptions(threshold=np.inf)
# 直接點(diǎn),設(shè)置無(wú)窮大展示
踩坑記錄
TypeError: only integer scalar arrays can be converted to a scalar index
看看你使用的方法里是不是傳參有誤摊聋,例如使用concatenate
方法拼接數(shù)組時(shí)應(yīng)該把數(shù)組都拼成一個(gè)列表/元組放進(jìn)去:
>>> x = np.array([1,2,3])
>>> y = np.array([4,5,6])
>>> np.concatenate(x, y)
# 拼接報(bào)錯(cuò)颅湘,因?yàn)槿思乙?guī)定第一個(gè)參數(shù)就是接受所有的數(shù)組
Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
np.concatenate(x, y)
TypeError: only integer scalar arrays can be converted to a scalar index
>>> np.concatenate((x, y))
# 可以看到拼接成功
array([1, 2, 3, 4, 5, 6])