亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

python科學計算之numpy——ufunc函數(shù)用法

 更新時間:2019年11月25日 15:05:38   作者:NeverMore_7  
今天小編就為大家分享一篇python科學計算之numpy——ufunc函數(shù)用法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

寫在前面

ufunc是universal function的縮寫,意思是這些函數(shù)能夠作用于narray對象的每一個元素上,而不是針對narray對象操作,numpy提供了大量的ufunc的函數(shù)。這些函數(shù)在對narray進行運算的速度比使用循環(huán)或者列表推導式要快很多,但請注意,在對單個數(shù)值進行運算時,python提供的運算要比numpy效率高。

四則運算

numpy提供的四則ufunc有如下一些:

numpy提供的四則運算unfunc能夠大大的提高計算效率,但如果運算式復雜,且參與運算的narray過大,會產生大量的中間結果,從而降低計算效率。例如:計算x=a*b+c時,實際上會按照如下方式計算:

t = a*b 
x = t+c 
del t

這會產生兩次內存分配,一次時x,一次時t,所以按照

x = a*b 
x = x+c

會節(jié)省一次內存的分配,從而提高效率。

比較運算 & bool運算

numpy同時提供了=、<、>等這些比較運算符,這些運算符的結果是bool值或者bool數(shù)組。

np.array([1,2,3]) < np.array([0,3,4])
array([False, True, True], dtype=bool)

邏輯運算and、or、not、xor等由于python提供了,所以numpy的這些邏輯運算符是以logical_開頭的函數(shù)

a = np.arange(5)
b= np.arange(4,-1,-1)
## print a==b
[False False True False False]
## print a>b
[False False False True True]
## print np.logical_or(a == b, a > b)
[False False True True True]

對兩個bool數(shù)組進行邏輯運算時,將發(fā)生ValueError異常,因為bool值也是True和False,numpy無法確定運算目的,可以使用numpy.any()和numpy.all()函數(shù),他們的使用方法和python的any()、all()函數(shù)用法相同。以bitwise_開頭的函數(shù)時用于位運算,如(bitwise_and、bitwise_or)等,也可以使用&、|、~和^來進行運算。

除了numpy提供的內置ufunc函數(shù),用戶也可以編寫自定義的ufunc函數(shù),方式是:

1. 編寫對單個數(shù)值計算的目的函數(shù);

2. 利用np.frompyfunc(func, nin, nout)將其轉換為ufunc函數(shù),其中func是上面編寫的目的函數(shù),nin是輸入的參數(shù)個數(shù),nout是返回值的個數(shù)。

## 基本形式
u_func = np.frompyfunc(func,nin,nout)
ret = u_func(narray_obj,param1,param2..)

這里返回的ret是object類型,所以實際上需要用astype()轉換為目的類型。numpy.vectorize()也實現(xiàn)了和numpy.frompyfunc()一樣的功能,區(qū)別是前者可以t通過otypes指定返回值的類型,不用再用astype()進行轉換。

## 基本形式
u_func = np.frompyfunc(func,otypes=[dtype1,dtype2..]
ret = u_func(narray_object,param1,param2..)

廣播

先看個例子:

a = np.arange(0,60,10).reshape(-1,1)
b = np.arange(0,5)
#a
array([[ 0],
  [10],
  [20],
  [30],
  [40],
  [50]])
#b
array([0, 1, 2, 3, 4])

ok,現(xiàn)在計算a+b,不過現(xiàn)在有一個問題,a和b的維度不一樣,那應該怎么加?先看看結果吧

# a+b
array([[ 0, 1, 2, 3, 4],
  [10, 11, 12, 13, 14],
  [20, 21, 22, 23, 24],
  [30, 31, 32, 33, 34],
  [40, 41, 42, 43, 44],
  [50, 51, 52, 53, 54]])

結果來看,是用a的每一行的元素(這里a為列向量,每一行只有一個元素)與b的每一個元素相加,相當于:

a=array([[ 0, 0, 0, 0, 0],
  [10, 10, 10, 10, 10],
  [20, 20, 20, 20, 20],
  [30, 30, 30, 30, 30],
  [40, 40, 40, 40, 40],
  [50, 50, 50, 50, 50]])

而b是一個行向量,現(xiàn)在我們將這一個行向量重復6次,和a的第0軸長度相同,構成一個二維數(shù)組,相當于:

b=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],
  [0, 1, 2, 3, 4]])

現(xiàn)在,再進行相加,自然就是對用元素相加了,也就是上面的結果,這就是numpy中的廣播,對進行運算的兩個narray對象shape不一樣時,進行的維度補齊。總的來說,numpy的廣播規(guī)則基于下面4個規(guī)則:

讓所有輸入數(shù)姐都向其中維數(shù)最多的數(shù)組看齊,shape屬性中不足的部分都通過在前面加1補齊; 如上面的輸入中,a.shape=(6,1),b.shape=(,5),a的維數(shù)是2,b的維數(shù)是1,所以b向a看齊,并且用1補齊,那么b.shape=(1,5)。

輸出數(shù)組的shape屬性是輸入數(shù)組的shape屬性的各個軸上的最大值 輸出是各軸上最大值,所以a+b的輸出的shape應該是(6,5);

如果輸入數(shù)組的某個軸的長度 為 1或與輸出數(shù)組的對應軸的長度相同,這個數(shù)組能夠用來計算,否則出錯

當輸入數(shù)組的某個軸的長度為1吋,沿著此軸運算時都用此軸上的第一組值

由于廣播在numpy計算中比較常見,所以numpy提供了ogrid和mgrid來創(chuàng)建廣播計算的數(shù)組,前者返回的是兩個向量,后者返回的是進行廣播運算的數(shù)組。

x,y = np.ogrid[:5,:5]
# x
array([[0],
  [1],
  [2],
  [3],
  [4]])
# y
array([[0, 1, 2, 3, 4]])
x,y=np.mgrid[:5,:5]
# x
[[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]]
#y
[[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]]]

ogrid[]參數(shù)是有兩種形式(1):[start:end:step]即起點、終點和步長;(2):[start:end:len]即起點、終點和數(shù)組長度,這里的長度為了和步長區(qū)分,在傳入時時以虛數(shù)方式傳入的,例如[1,5,4j]將產生[1,2,3,4]這樣的數(shù)組。

另外廣播支持特殊的下標None,意義時在對應位置上產生1的新軸,例如a[None,:]等效于a.reshape((1,-1)),a[:,None]等效于a.reshape((-1,1)),另外,np.ix_()能將一維數(shù)組轉換為能進行廣播的二維數(shù)組:

x=np.array([0,1,4,10])
y=np.array([2,3,8])
gy,gx=np.ix_(y,x)
#print gy
[[2]
[3]
[8]]
#print gx
[[ 0 1 4 10]]
# gx+gy
array([[ 2, 3, 6, 12],
  [ 3, 4, 7, 13],
  [ 8, 9, 12, 18]])

np.ix_()支持多個參數(shù),從而支持n維空間的廣播計算。

ufunc方法

ufunc函數(shù)對象本身還有一些方法函數(shù),這些方法只對兩個輸入、一個輸出的ufunc 函數(shù)有效,其他的ufunc對象調用這些方法時會拋出ValueError異常。

(1). reduce(),沿著指定軸對數(shù)組進行操作,相當于將相應的操作放到該軸元素之間。

np.add.reduce([1,2,3]) #1+2+3=6
np.add.reduce([[1,2,3],[4,5,6]]) #[1+4,2+5,3+6]=[5,7,9]
np.add.reduce([[1,2,3],[4,5,6]],axis=1) #[1+2+3,4+5+6]=[6,15]

(2). accumulate()和reduce()類似,區(qū)別時是前者會保留中間結果:

np.add.accumulate([1,2,3]) #[1,1+2,1+2+3]=[1,3,6]
np.add.accumulate([[1,2,3],[4,5,6]],axis=1) 
#
array([[ 1, 3, 6],
  [ 4, 9, 15]])

(3). reduceat()方法計算多紐reduce()的結果,通 過 indices參數(shù)指定一系列的起始和終止位置。它的計算有些特別,,計算的方法如下:

if indices[i] < indices[i+1]:
 result[i] = <op>.reduce(a[indices[i]:indices[i+1]])
else:
 result[i] = a[indices[i]]
#result[-1]的計算如下:
<op>.reduce(a[indices[-1]:])

例:

a = np.array([1,2,3,4])
result = np.add.reduceat(a, indices=[0,1,0,2,0,3,0])
## result
array([1,2,3,3,6,4,10])

## 計算過程如下:
 : a[0] -> 1
 : a[1] -> 2
 : a[0] + a[1] -> 1 + 2
 : a[2] -> 3
 : a[0] + a[1] + a[2] -> 1 + 2 + 3 = 6
 : a[3] -> 4
 :a[0] + a[1] + a[2] + a[4] - > 1 + 2 + 3 + 4 = 1 0

再看多維數(shù)組

在前一篇文章中我們提到過多維數(shù)組,現(xiàn)在我們回頭再看看多維數(shù)組的下標取數(shù)據(jù)。首先,多維數(shù)組的下標應該是一個長度和數(shù)組的維數(shù)相同的元組。如栗下標元組的長度比數(shù)組的維數(shù)大,就會出錯;如果小,就 會 在 下 標 元 組 的 后 而 補 ,使得它的長度與數(shù)組維數(shù)相同。如果下標對象不是元組,則 numpy會首先把它轉換為元組。這種轉換可能會和用戶所希望的不一致,因此為了避免出現(xiàn)問題,請 “顯式”地使用元組作為下標。

a = np.arange(3*4*5).reshape(3,4,5)
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, 32, 33, 34],
  [35, 36, 37, 38, 39]],

  [[40, 41, 42, 43, 44],
  [45, 46, 47, 48, 49],
  [50, 51, 52, 53, 54],
  [55, 56, 57, 58, 59]]])

lidx=[[0],[1]]
#a[lidx]

aidx = np.array(lidx)
#a[aidx]
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, 32, 33, 34],
   [35, 36, 37, 38, 39]]]])

可以看到,numpy把列表[[0],[1]]轉換成元組([0],[1]),而把數(shù)組對象轉換成(aidx,:,:)。

整數(shù)數(shù)組和切片做為下標

如果利用數(shù)組作為下標,但數(shù)組的維度都不一樣,那么這個時候這些數(shù)組將會應用廣播規(guī)則把這些數(shù)組轉換成一樣,轉換的規(guī)則是上面說到的先用1補足然后取各個維度的最大值。

i0 = np.array([[1,2,1],[0,1,0]])
i1 = np.array([[[0]],[[1]]])
i2 = np.array([[[2,3,2]]])
#print i0.shape
(2, 3)
#print i1.shape
(2, 1, 1)
#print i2.shape
(1, 1, 3)
# i0補齊之后為 (1,2,3),然后取最大值為
(2,2,3)

這里將所有的數(shù)組進行廣播,把所有的數(shù)組轉換成shape=(2,2,3),利用numpy.broadcast_arrays()可以查看廣播后的數(shù)組:

id0,id1,id2=np.broadcast_arrays(i0,i1,i2)
#id0
[[[1 2 1]
 [0 1 0]]

 [[1 2 1]
 [0 1 0]]
#id1
[[[0 0 0]
 [0 0 0]]

 [[1 1 1]
 [1 1 1]]]
#id2
[[[2 3 2]
 [2 3 2]]

 [[2 3 2]
 [2 3 2]]]

然后利用下標取元素時,例如i,j,k=1,1,1時,取得的元素應該是a[id0[i,j,k],id1[i,j,k],id2[i,j,k]]=a[1,1,3]=28。下標中含有切片時,首先來看第一種,就是整數(shù)數(shù)組時連續(xù)的,也就是數(shù)組之間沒有切片,例如a[1:3,i0,i1],這種情況下,首先會把整數(shù)數(shù)組(i0,i1)廣播,然后將切片的長度放到相應的位置構成一個維度,i0,i1廣播后的shape=(2,2,3),切片的長度為2,所以最后的shape=(2,2,2,3)。最后的結果是a[1:3,id0[i,j,k],id1[i,j,k]]。再者,如果切片是再整數(shù)數(shù)組之間,那么同樣會將數(shù)組廣播,然后把切片位置替換為數(shù)組的維度或者切片的長度添加到索引的最后面,如a[i0,:,i1],i0,i1廣播后的shape=(2,2,3),數(shù)組a的第二個軸的長度為4,所以最后的shape=(2,2,3,4)。

bool數(shù)組做為下標

用bool數(shù)組作為下標時,會將bool數(shù)組中為True的索引組成一個整數(shù)數(shù)組,然后以此數(shù)組作為下標。相當于用numpy.nonzero(bool_array)的結果,例如:

b2 = np.array([[True,False,True],[True,False,False]])
np.nonzero(b2)
##
(array([0, 0, 1]), array([0, 2, 0]))
## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## 
## 相當于取[0,0],[0,2],[1,0]

除此之外,如果bool數(shù)組中有切片,那么相當于將bool值轉換成nonzero()后的整數(shù)數(shù)組,切片位置不變。

以上這篇python科學計算之numpy——ufunc函數(shù)用法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • TensorFlow人工智能學習按索引取數(shù)據(jù)及維度變換詳解

    TensorFlow人工智能學習按索引取數(shù)據(jù)及維度變換詳解

    這篇文章主要為大家介紹了TensorFlow人工智能學習按索引取數(shù)據(jù)及維度變換的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-11-11
  • OpenCV實戰(zhàn)案例之車道線識別詳解

    OpenCV實戰(zhàn)案例之車道線識別詳解

    計算機視覺在自動化系統(tǒng)觀測環(huán)境、預測該系統(tǒng)控制器輸入值等方面起著至關重要的作用,下面這篇文章主要給大家介紹了關于OpenCV實戰(zhàn)案例之車道線識別的相關資料,需要的朋友可以參考下
    2022-10-10
  • python中的變量命名規(guī)則詳情

    python中的變量命名規(guī)則詳情

    這篇文章主要介紹了python中的變量命名規(guī)則詳情,變量名可以包括字母、數(shù)字、下劃線,但是數(shù)字不能做為開頭,變量用的好或不好,和代碼質量有著非常重要的聯(lián)系,合理的使用變量,可以讓你的代碼可讀性更高并且更加簡潔,下面相關內容吧需要的小伙伴可以參考一下
    2022-03-03
  • pytorch中的matmul與mm,bmm區(qū)別說明

    pytorch中的matmul與mm,bmm區(qū)別說明

    這篇文章主要介紹了pytorch中的matmul與mm,bmm區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • 11個Python Pandas小技巧讓你的工作更高效(附代碼實例)

    11個Python Pandas小技巧讓你的工作更高效(附代碼實例)

    這篇文章主要介紹了11個Python Pandas小技巧讓你的工作更高效(附代碼實例),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-04-04
  • python實現(xiàn)石頭剪刀布程序

    python實現(xiàn)石頭剪刀布程序

    這篇文章主要為大家詳細介紹了python實現(xiàn)石頭剪刀布程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • python區(qū)塊鏈簡易版交易完善挖礦獎勵示例

    python區(qū)塊鏈簡易版交易完善挖礦獎勵示例

    這篇文章主要介紹了python區(qū)塊鏈簡易版交易完善挖礦獎勵示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • Python面向對象程序設計示例小結

    Python面向對象程序設計示例小結

    這篇文章主要介紹了Python面向對象程序設計,結合實例形式總結分析了Python面向對象程序設計中比較常見的類定義、實例化、繼承、私有變量等相關使用技巧與操作注意事項,需要的朋友可以參考下
    2019-01-01
  • PyQt5類型判定+對象刪除操作

    PyQt5類型判定+對象刪除操作

    這篇文章主要介紹了PyQt5類型判定+對象刪除操作,本文通過實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2024-06-06
  • python實時監(jiān)控cpu小工具

    python實時監(jiān)控cpu小工具

    這篇文章主要為大家詳細介紹了python實時監(jiān)控cpu的小工具,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06

最新評論