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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

适合初学者快速入门的Numpy实战全集

發布時間:2025/3/8 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 适合初学者快速入门的Numpy实战全集 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Numpy是一個用python實現的科學計算的擴展程序庫,包括:1、一個強大的N維數組對象Array;2、比較成熟的(廣播)函數庫;3、用于整合C/C++和Fortran代碼的工具包;4、實用的線性代數、傅里葉變換和隨機數生成函數。numpy和稀疏矩陣運算包scipy配合使用更加方便。

NumPy(Numeric Python)提供了許多高級的數值編程工具,如:矩陣數據類型、矢量處理,以及精密的運算庫。專為進行嚴格的數字處理而產生。多為很多大型金融公司使用,以及核心的科學計算組織如:Lawrence Livermore,NASA用其處理一些本來使用C++,Fortran或Matlab等所做的任務。

好久沒來長文了,今天來一篇年終代碼長文,那么看完這一篇你將學到numpy的基本常用操作,下面一起來看吧,歡迎轉發支持,謝謝!!!(本文作者:光城)

本文目錄

1.Numpy基本操作1.1 列表轉為矩陣1.2 維度1.3 行數和列數()1.4 元素個數2.Numpy創建array2.1 一維array創建2.1 多維array創建2.2 創建全零數組2.3 創建全一數據2.4 創建全空數組2.5 創建連續數組2.6 reshape操作2.7 創建連續型數據2.8 linspace的reshape操作3.Numpy基本運算3.1 一維矩陣運算3.2 多維矩陣運算3.3 基本計算4.Numpy索引與切片5.Numpy array合并5.1 數組合并5.2 數組轉置為矩陣5.3 多個矩陣合并5.4 合并例子26.Numpy array分割6.1 構造3行4列矩陣6.2 等量分割6.3 不等量分割6.4 其他的分割方式7.Numpy copy與 =7.1 =賦值方式會帶有關聯性7.2 copy()賦值方式沒有關聯性8.廣播機制9.常用函數

1.Numpy基本操作

1.1 列表轉為矩陣

import?numpy?as?np array?=?np.array([[1,3,5],[4,6,9] ])print(array)

輸出:

[[1?3?5][4?6?9]]

1.2 維度

print('number?of?dim:',?array.ndim)

輸出:

number?of?dim:?2

1.3 行數和列數()

print('shape:',array.shape)

輸出:

shape:?(2,?3)

1.4 元素個數

print('size:',array.size)

輸出:

size:6

2.Numpy創建array

2.1 一維array創建

import?numpy?as?np #?一維array a?=?np.array([2,23,4],?dtype=np.int32)?#?np.int默認為int32 print(a) print(a.dtype)

輸出:

[?2?23??4] int32

2.1 多維array創建

#?多維array a?=?np.array([[2,3,4],[3,4,5]]) print(a)?#?生成2行3列的矩陣

輸出:

[[2?3?4][3?4?5]]

2.2 創建全零數組

a?=?np.zeros((3,4)) print(a)?#?生成3行4列的全零矩陣

輸出:

[[0.?0.?0.?0.][0.?0.?0.?0.][0.?0.?0.?0.]]

2.3 創建全一數據

#?創建全一數據,同時指定數據類型 a?=?np.ones((3,4),dtype=np.int) print(a)

輸出:

[[1?1?1?1][1?1?1?1][1?1?1?1]]

2.4 創建全空數組

#?創建全空數組,其實每個值都是接近于零的數 a?=?np.empty((3,4)) print(a)

輸出:

[[0.?0.?0.?0.][0.?0.?0.?0.][0.?0.?0.?0.]]

2.5 創建連續數組

#?創建連續數組 a?=?np.arange(10,21,2)?#?10-20的數據,步長為2 print(a)

輸出:

[10?12?14?16?18?20]

2.6 reshape操作

#?使用reshape改變上述數據的形狀 b?=?a.reshape((2,3)) print(b)

輸出:

[[10?12?14][16?18?20]]

2.7 創建連續型數據

#?創建線段型數據 a?=?np.linspace(1,10,20)?#?開始端1,結束端10,且分割成20個數據,生成線段 print(a)

輸出:

[?1.??????????1.47368421??1.94736842??2.42105263??2.89473684??3.368421053.84210526??4.31578947??4.78947368??5.26315789??5.73684211??6.210526326.68421053??7.15789474??7.63157895??8.10526316??8.57894737??9.052631589.52631579?10.????????]

2.8 linspace的reshape操作

#?同時也可以reshape b?=?a.reshape((5,4)) print(b)

輸出:

[[?1.??????????1.47368421??1.94736842??2.42105263][?2.89473684??3.36842105??3.84210526??4.31578947][?4.78947368??5.26315789??5.73684211??6.21052632][?6.68421053??7.15789474??7.63157895??8.10526316][?8.57894737??9.05263158??9.52631579?10.????????]]

3.Numpy基本運算

3.1 一維矩陣運算

import?numpy?as?np #?一維矩陣運算 a?=?np.array([10,20,30,40]) b?=?np.arange(4) print(a,b) #?[10?20?30?40]?[0?1?2?3] c?=?a?-?b print(c) #?[10?19?28?37] print(a*b)?#?若用a.dot(b),則為各維之和 #?[??0??20??60?120] #?在Numpy中,想要求出矩陣中各個元素的乘方需要依賴雙星符號?**,以二次方舉例,即: c?=?b**2 print(c) #?[0?1?4?9] #?Numpy中具有很多的數學函數工具 c?=?np.sin(a) print(c) #?[-0.54402111??0.91294525?-0.98803162??0.74511316] print(b<2) #?[?True??True?False?False] a?=?np.array([1,1,4,3]) b?=?np.arange(4) print(a==b) #?[False??True?False??True]

3.2 多維矩陣運算

a?=?np.array([[1,1],[0,1]]) b?=?np.arange(4).reshape((2,2)) print(a) ''' [[1?1][0?1]] ''' print(b) ''' [[0?1][2?3]] ''' #?多維度矩陣乘法 #?第一種乘法方式: c?=?a.dot(b) print(c) #?第二種乘法: c?=?np.dot(a,b) print(c) ''' [[2?4][2?3]] ''' #?多維矩陣乘法不能直接使用'*'號a?=?np.random.random((2,4))print(np.sum(a))?#?3.657010765991042 print(np.min(a))?#?0.10936760904735132 print(np.max(a))?#?0.9476048882750654print("a=",a) ''' a=?[[0.16607436?0.94760489?0.59649117?0.22698245][0.66494464?0.23447984?0.10936761?0.71106581]] '''print("sum=",np.sum(a,axis=1))?#?sum=?[1.93715287?1.7198579?] print("min=",np.min(a,axis=0))?#?min=?[0.16607436?0.23447984?0.10936761?0.22698245] print("max=",np.max(a,axis=1))?#?max=?[0.94760489?0.71106581]''' 如果你需要對行或者列進行查找運算, 就需要在上述代碼中為?axis?進行賦值。 當axis的值為0的時候,將會以列作為查找單元, 當axis的值為1的時候,將會以行作為查找單元。 '''

3.3 基本計算

import?numpy?as?npA?=?np.arange(2,14).reshape((3,4)) print(A)#?最小元素索引 print(np.argmin(A))?#?0 #?最大元素索引 print(np.argmax(A))?#?11 #?求整個矩陣的均值 print(np.mean(A))?#?7.5 print(np.average(A))?#?7.5 print(A.mean())?#?7.5 #?中位數 print(np.median(A))?#?7.5 #?累加 print(np.cumsum(A)) #?[?2??5??9?14?20?27?35?44?54?65?77?90] #?累差運算 B?=?np.array([[3,5,9],[4,8,10]]) print(np.diff(B)) ''' [[2?4][4?2]] ''' C?=?np.array([[0,5,9],[4,0,10]]) print(np.nonzero(B)) print(np.nonzero(C)) ''' #?將所有非零元素的行與列坐標分割開,重構成兩個分別關于行和列的矩陣 (array([0,?0,?0,?1,?1,?1],?dtype=int64),?array([0,?1,?2,?0,?1,?2],?dtype=int64)) (array([0,?0,?1,?1],?dtype=int64),?array([1,?2,?0,?2],?dtype=int64)) ''' #?仿照列表排序 A?=?np.arange(14,2,-1).reshape((3,4))?#?-1表示反向遞減一個步長 print(A) ''' [[14?13?12?11][10??9??8??7][?6??5??4??3]] ''' print(np.sort(A)) ''' #?只是對每行進行遞增排序 [[11?12?13?14][?7??8??9?10][?3??4??5??6]] ''' #?矩陣轉置 print(np.transpose(A)) ''' [[14?10??6][13??9??5][12??8??4][11??7??3]] ''' print(A.T) ''' [[14?10??6][13??9??5][12??8??4][11??7??3]] ''' print(A) print(np.clip(A,5,9)) ''' clip(Array,Array_min,Array_max) 將Array_min<X<Array_max??X表示矩陣A中的數,如果滿足上述關系,則原數不變。 否則,如果X<Array_min,則將矩陣中X變為Array_min; 如果X>Array_max,則將矩陣中X變為Array_max. [[9?9?9?9][9?9?8?7][6?5?5?5]] '''

4.Numpy索引與切片

import?numpy?as?np A?=?np.arange(3,15) print(A) #?[?3??4??5??6??7??8??9?10?11?12?13?14] print(A[3]) #?6 B?=?A.reshape(3,4) print(B) ''' [[?3??4??5??6][?7??8??9?10][11?12?13?14]] ''' print(B[2]) #?[11?12?13?14] print(B[0][2]) #?5 print(B[0,2]) #?5 #?list切片操作 print(B[1,1:3])?#?[8?9]?1:3表示1-2不包含3for?row?in?B:print(row)''' [3?4?5?6] [?7??8??9?10] [11?12?13?14] ''' #?如果要打印列,則進行轉置即可 for?column?in?B.T:print(column) ''' [?3??7?11] [?4??8?12] [?5??9?13] [?6?10?14] ''' #?多維轉一維 A?=?np.arange(3,15).reshape((3,4)) #?print(A) print(A.flatten()) #?flat是一個迭代器,本身是一個object屬性 for?item?in?A.flat:print(item)

我們一起來來總結一下,看下面切片取值方式(對應顏色是取出來的結果):

5.Numpy array合并

5.1 數組合并

import?numpy?as?np A?=?np.array([1,1,1]) B?=?np.array([2,2,2]) print(np.vstack((A,B))) #?vertical?stack?上下合并,對括號的兩個整體操作。 ''' [[1?1?1][2?2?2]] ''' C?=?np.vstack((A,B)) print(C) print(A.shape,B.shape,C.shape) #?(3,)?(3,)?(2,?3) #?從shape中看出A,B均為擁有3項的數組(數列) #?horizontal?stack左右合并 D?=?np.hstack((A,B)) print(D) #?[1?1?1?2?2?2] print(A.shape,B.shape,D.shape) #?(3,)?(3,)?(6,) #?對于A,B這種,為數組或數列,無法進行轉置,需要借助其他函數進行轉置

5.2 數組轉置為矩陣

print(A[np.newaxis,:])?#?[1?1?1]變為[[1?1?1]] print(A[np.newaxis,:].shape)?#?(3,)變為(1,?3) print(A[:,np.newaxis]) ''' [[1][1][1]] '''

5.3 多個矩陣合并

#?concatenate的第一個例子 print("------------") print(A[:,np.newaxis].shape)?#?(3,1) A?=?A[:,np.newaxis]?#?數組轉為矩陣 B?=?B[:,np.newaxis]?#?數組轉為矩陣 #?axis=0縱向合并 C?=?np.concatenate((A,B,B,A),axis=0) print(C) ''' [[1][1][1][2][2][2][2][2][2][1][1][1]] ''' #?axis=1橫向合并 C?=?np.concatenate((A,B),axis=1) print(C) ''' [[1?2][1?2][1?2]] '''

5.4 合并例子2

#?concatenate的第二個例子 print("-------------") a?=?np.arange(8).reshape(2,4) b?=?np.arange(8).reshape(2,4) print(a) print(b) print("-------------") #?axis=0多個矩陣縱向合并 c?=?np.concatenate((a,b),axis=0) print(c) #?axis=1多個矩陣橫向合并 c?=?np.concatenate((a,b),axis=1) print(c) ''' [[0?1?2?3][4?5?6?7][0?1?2?3][4?5?6?7]] [[0?1?2?3?0?1?2?3][4?5?6?7?4?5?6?7]] '''

6.Numpy array分割

6.1 構造3行4列矩陣

import?numpy?as?np A?=?np.arange(12).reshape((3,4)) print(A) ''' [[?0??1??2??3][?4??5??6??7][?8??9?10?11]] '''

6.2 等量分割

#?等量分割 #?縱向分割同橫向合并的axis print(np.split(A,?2,?axis=1)) ''' [array([[0,?1],[4,?5],[8,?9]]),?array([[?2,??3],[?6,??7],[10,?11]])] ''' #?橫向分割同縱向合并的axis print(np.split(A,3,axis=0)) #?[array([[0,?1,?2,?3]]),?array([[4,?5,?6,?7]]),?array([[?8,??9,?10,?11]])]

6.3 不等量分割

print(np.array_split(A,3,axis=1)) ''' [array([[0,?1],[4,?5],[8,?9]]),?array([[?2],[?6],[10]]),?array([[?3],[?7],[11]])] '''

6.4 其他的分割方式

#?橫向分割 print(np.vsplit(A,3))?#?等價于print(np.split(A,3,axis=0)) #?[array([[0,?1,?2,?3]]),?array([[4,?5,?6,?7]]),?array([[?8,??9,?10,?11]])] #?縱向分割 print(np.hsplit(A,2))?#?等價于print(np.split(A,2,axis=1)) ''' [array([[0,?1],[4,?5],[8,?9]]),?array([[?2,??3],[?6,??7],[10,?11]])] '''

7.Numpy copy與 =

7.1 =賦值方式會帶有關聯性

import?numpy?as?np #?`=`賦值方式會帶有關聯性 a?=?np.arange(4) print(a)?#?[0?1?2?3]b?=?a c?=?a d?=?b a[0]?=?11 print(a)?#?[11??1??2??3] print(b)?#?[11??1??2??3] print(c)?#?[11??1??2??3] print(d)?#?[11??1??2??3] print(b?is?a)?#?True print(c?is?a)?#?True print(d?is?a)?#?Trued[1:3]?=?[22,33] print(a)?#?[11?22?33??3] print(b)?#?[11?22?33??3] print(c)?#?[11?22?33??3]

7.2 copy()賦值方式沒有關聯性

a?=?np.arange(4) print(a)?#?[0?1?2?3] b?=a.copy()?#?deep?copy print(b)?#?[0?1?2?3] a[3]?=?44 print(a)?#?[?0??1??2?44] print(b)?#?[0?1?2?3]#?此時a與b已經沒有關聯

8.廣播機制

numpy數組間的基礎運算是一對一,也就是a.shape==b.shape,但是當兩者不一樣的時候,就會自動觸發廣播機制,如下例子:

from?numpy?import?array a?=?array([[?0,?0,?0],[10,10,10],[20,20,20],[30,30,30]]) b?=?array([0,1,2]) print(a+b)

輸出:

[[?0??1??2][10?11?12][20?21?22][30?31?32]]

為什么是這個樣子?

這里以tile模擬上述操作,來回到a.shape==b.shape情況!

#?對[0,1,2]行重復3次,列重復1次 b?=?np.tile([0,1,2],(4,1)) print(a+b)

輸出:

[[?0??1??2][10?11?12][20?21?22][30?31?32]]

到這里,我們來給出一張圖:

也可以看這張圖:

是不是任何情況都可以呢?

當然不是,只有當兩個數組的trailing dimensions ?compatible時才會觸發廣播,否則報錯ValueError: frames are not aligned exception。

上面表達意思是尾部維度必須兼容

尾部維度:

將多維數組右對齊!能夠上下對應,這部分就是尾部,而對應的頭部維度,則是維度大的數組比維度小的數組多出來的維度!如下面實際例子:

?????????????axis:???0?????1???2 a??????(3d?array):?256?x?256?x?3 b??????(2d?array):???????256?x?3 a?+?b??(2d?array):?256?x?256?x?3

兼容

they are equal, or one of them is 1

兼容兩層意思,深入研究,第一:they are equal

尾部維度相等!

?????????????axis:???0?????1???2 a??????(3d?array):?256?x?256?x?3 b??????(2d?array):???????256?x?3 a?+?b??(2d?array):?256?x?256?x?3

第二:one of them is 1

像下面這個尾部維度不等,但是a或者b對應的元素有1存在,那么也滿足兼容性!

?????????????axis:???0?????1???2 a??????(3d?array):?256?x?256?x?1 b??????(2d?array):????????1??x?3 a?+?b??(2d?array):?256?x?256?x?3

也就是1可以和任意維度兼容!

廣播失敗:

?????????????axis:???0?????1???2 a1??????(3d?array):?256?x?256?x?1 b??????(2d?array):???????220?x?3 a1?+?b??ValueError

失敗轉化

?????????????axis:???0?????1???2???3 a2??????(4d?array):?256?x?256?x?1?x?1 b??????(2d?array):???????????220?x?3 a2?+?b??(4d?array):?256?x?256?x?220?x?3

我們看到在a2的第三個維度增加了一個1,擴充為4維,便可以正常廣播!

如何實現a1到a2轉化?

a2 = a1[:,:,np.newaxis,:]即可!

9.常用函數

9.1 np.bincount()

首先生成一個一維數組

x?=?np.array([1,?2,?3,?3,?0,?1,?4])

統計索引出現次數:索引0出現1次,1出現2次,2出現1次,3出現2次,4出現1次

因此通過bincount計算出索引出現次數如下:

np.bincount(x) #?[1?2?1?2?1]

上面怎么得到的?

對于bincount計算嗎,bin的數量比x中最大數多1,例如x最大為4,那么bin數量為5(index從0到4),也就會bincount輸出的一維數組為5個數,bincount中的數又代表什么?代表的是它的索引值在x中出現的次數!

還是以上述x為例子,當我們設置weights參數時候,結果又是什么?

這里假定:

w?=?np.array([0.3,0.5,0.7,0.6,0.1,-0.9,1])

那么設置這個w權重后,結果為多少?

np.bincount(x,weights=w)

輸出:

[?0.1?-0.6??0.5??1.3??1.?]

怎么計算的?

先對x與w抽取出來:

x?--->??[1,?2,?3,?3,?0,?1,?4] w?--->??[0.3,0.5,0.7,0.6,0.1,-0.9,1]

索引 0 出現在x中index=4位置,那么在w中訪問index=4的位置即可,w[4]=0.1
索引 1 出現在x中index=0與index=5位置,那么在w中訪問index=0與index=5的位置即可,然后將兩這個加和,計算得:w[0]+w[5]=-0.6
其余的按照上面的方法即可!

bincount的另外一個參數為minlength,這個參數簡單,可以這么理解,當所給的bin數量多于實際從x中得到的bin數量后,后面沒有訪問到的設置為0即可。

還是上述x為例:

這里我們直接設置minlength=7參數,并輸出!

[1?2?1?2?1?0?0]

與上面相比多了兩個0,這兩個怎么會多?

上面知道,這個bin數量為5,index從0到4,那么當minlength為7的時候,也就是總長為7,index從0到6,多了后面兩位,直接補位為0即可!

9.2 np.argmax()

函數原型為:numpy.argmax(a, axis=None, out=None).

函數表示返回沿軸axis最大值的索引。

x?=?[[1,3,3],[7,5,2]] print(np.argmax(x)) #?3

對于這個例子我們知道,7最大,索引位置為3(這個索引按照遞增順序)!

axis屬性

axis=0表示按列操作,也就是對比當前列,找出最大值的索引!

x?=?[[1,3,3],[7,5,2]] print(np.argmax(x,axis=0)) #?[1?1?0]

axis=1表示按行操作,也就是對比當前行,找出最大值的索引!

x?=?[[1,3,3],[7,5,2]] print(np.argmax(x,axis=0)) #?[1?0]

那如果碰到重復最大元素?

返回第一個最大值索引即可!

例如:

x?=?np.array([1,?3,?2,?3,?0,?1,?0]) print(x.argmax()) #?1

9.3 上述合并實例

這里來融合上述兩個函數,舉個例子:

x?=?np.array([1,?2,?3,?3,?0,?1,?4]) print(np.argmax(np.bincount(x)))

最終結果為1,為什么?

首先通過np.bincount(x)得到的結果是:[1 2 1 2 1],再根據最后的遇到重復最大值項,則返回第一個最大值的index即可!2的index為1,所以返回1。

9.4 求取精度

取指定位置的精度

In

np.around([-0.6,1.2798,2.357,9.67,13],?decimals=0)

Out

看到沒,負數進位取絕對值大的!

array([-1.,??1.,??2.,?10.,?13.])

In

np.around([1.2798,2.357,9.67,13],?decimals=1)

Out

array([?1.3,??2.4,??9.7,?13.?])

In

np.around([1.2798,2.357,9.67,13],?decimals=2)

Out

array([?1.28,??2.36,??9.67,?13.??])

從上面可以看出,decimals表示指定保留有效數的位數,當超過5就會進位(此時包含5)!

但是,如果這個參數設置為負數,又表示什么?

In

np.around([1,2,5,6,56],?decimals=-1)

Out

array([?0,??0,??0,?10,?60])

發現沒,當超過5時候(不包含5),才會進位!-1表示看一位數進位即可,那么如果改為-2呢,那就得看兩位!

例如:

In

np.around([1,2,5,50,56,190],?decimals=-2)

Out

array([??0,???0,???0,???0,?100,?200])

看到沒,必須看兩位,超過50才會進位,190的話,就看后面兩位,后兩位90超過50,進位,那么為200!

計算沿指定軸第N維的離散差值

In

x?=?np.arange(1?,?16).reshape((3?,?5))

Out

array([[?1,??2,??3,??4,??5],[?6,??7,??8,??9,?10],[11,?12,?13,?14,?15]])

In

np.diff(x,axis=1)?#默認axis=1

Out

array([[1,?1,?1,?1],[1,?1,?1,?1],[1,?1,?1,?1]])

In

np.diff(x,axis=0)?

Out

array([[5,?5,?5,?5,?5],[5,?5,?5,?5,?5]])

取整

In

np.floor([-0.6,-1.4,-0.1,-1.8,0,1.4,1.7])

Out

array([-1.,?-2.,?-1.,?-2.,??0.,??1.,??1.])

看到沒,負數取整,跟上述的around一樣,是向左!

取上限

np.ceil([1.2,1.5,1.8,2.1,2.0,-0.5,-0.6,-0.3])

取上限!找這個小數的最大整數即可!

查找

利用np.where實現小于0的值用0填充嗎,大于0的數不變!

In

x?=?np.array([[1,?0],[2,?-2],[-2,?1]])

Out

array([[?1,??0],[?2,?-2],[-2,??1]])

In

np.where(x>0,x,0)

Out

array([[1,?0],[2,?0],[0,?1]])

作者光城的公眾號:

請關注和分享↓↓↓?

機器學習初學者

QQ群:774999266

往期精彩回顧

  • 良心推薦:機器學習入門資料匯總及學習建議(2018版)

  • 黃海廣博士的github鏡像下載(機器學習及深度學習資源)

  • 吳恩達老師的機器學習和深度學習課程筆記打印版

  • 機器學習小抄-(像背托福單詞一樣理解機器學習)

  • 首發:深度學習入門寶典-《python深度學習》原文代碼中文注釋版及電子書

  • 科研工作者的神器-zotero論文管理工具

  • 機器學習的數學基礎

  • 機器學習必備寶典-《統計學習方法》的python代碼實現、電子書及課件

  • 吐血推薦收藏的學位論文排版教程(完整版)

總結

以上是生活随笔為你收集整理的适合初学者快速入门的Numpy实战全集的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。