首頁  >  文章  >  後端開發  >  Python中的numpy.ufunc函數怎麼使用

Python中的numpy.ufunc函數怎麼使用

WBOY
WBOY轉載
2023-05-18 19:32:161728瀏覽

一、說明

        numpy.ufunc是何種函數?答曰:就是numpy的函數,因為numpy針對的是陣列張量,因此,幾乎每個函數都是ufunc。

二、numpy.ufunc函數概念

2.1 numpy.ufunc簡介

        在整個陣列上逐個元素操作的函數。因此,ufunc是個泛指,這些函數為數眾多。

        通用函數(或簡稱 ufunc)是以逐元素的方式對 ndarrays 操作的函數,支援陣列廣播、型別轉換和其他一些標準功能。 Ufunc是將函數「向量化」的封裝器,它使用固定數量的特定輸入,並產生固定數量的特定輸出。請查閱基礎通用函數 (ufunc) 的詳細資訊。

        在NumPy中,而通函數是指numpy.ufunc類別的實例 。許多內建函數都是在編譯的C程式碼中實現的。基本的ufuncs對標量進行操作,但也有一種通用類型,基本元素是子數組(向量,矩陣等), 廣播是在其他維度上完成的。也可以ufunc使用frompyfuncopen in new window工廠函數產生自訂實例。

2.2 numpy.ufunc.nin與numpy.ufunc.nout

        此函數表述對應ufun函數輸入參數的數量,如以下所列ufunc時所對應的輸入參數數量。

np.add.nin
2
np.multiply.nin
2
np.power.nin
2
np.exp.nin
2

         此函數表述對應ufun函數的輸出參數數量,如以下ufunc所對應的輸入參數數量。

np.add.nout
1
np.multiply.nout
1
np.power.nout
1
np.exp.nout
1

2.3 numpy.ufunc.nargs

numpy.ufunc對應參數的個數,

np.add.nargs
3
np.multiply.nargs
3
np.power.nargs
3
np.exp.nargs
2

 如np.add函數有三個參數,兩個輸入,一個輸出,如下:

a = np.array([2,4,5,6])
b = np.array([2,2,3,3])
c = np.zeros((4,))
np.add(  a,b,c )
print( c )

2.4  numpy.ufunc.ntypes

        顯示一個ufunc的輸入資料型別格式:ufunc 可操作的數位NumPy 類型的數量——總共有18 種。

np.add.ntypes
18
np.multiply.ntypes
18
np.power.ntypes
17
np.exp.ntypes
7
np.remainder.ntypes
14

 2.5  numpy.ufunc.type

np.add.types
['??->?', 'bb->b', 'BB->B', 'hh->h', 'HH->H', 'ii->i', 'II->I', 'll->l',
'LL->L', 'qq->q', 'QQ->Q', 'ff->f', 'dd->d', 'gg->g', 'FF->F', 'DD->D',
'GG->G', 'OO->O']
np.multiply.types
['??->?', 'bb->b', 'BB->B', 'hh->h', 'HH->H', 'ii->i', 'II->I', 'll->l',
'LL->L', 'qq->q', 'QQ->Q', 'ff->f', 'dd->d', 'gg->g', 'FF->F', 'DD->D',
'GG->G', 'OO->O']
np.power.types
['bb->b', 'BB->B', 'hh->h', 'HH->H', 'ii->i', 'II->I', 'll->l', 'LL->L',
'qq->q', 'QQ->Q', 'ff->f', 'dd->d', 'gg->g', 'FF->F', 'DD->D', 'GG->G',
'OO->O']
np.exp.types
['f->f', 'd->d', 'g->g', 'F->F', 'D->D', 'G->G', 'O->O']
np.remainder.types
['bb->b', 'BB->B', 'hh->h', 'HH->H', 'ii->i', 'II->I', 'll->l', 'LL->L',
'qq->q', 'QQ->Q', 'ff->f', 'dd->d', 'gg->g', 'OO->O']

2.6 維度ndim和shape

        顯示維度的參數有兩個,array.ndim  和array.shape,其中array.shapendim是指張量共幾個維度,shape是指每個維度下的向量長度。例如下例:

x = np.array([1, 2, 3])
print(x.ndim)
print(x.shape)
 
y = np.zeros((2, 3, 4))
print(y.ndim)
print(y.shape)

 結果:

1
(3,)
3
(2, 3, 4)

#三、ufunc的廣播特性

        每個通函數接受陣列輸入並透過在輸入上逐元素地執行核心功能來產生陣列輸出(其中元素通常是標量,但可以是用於廣義ufunc的向量或更高階子數組)。依照標準廣播規則進行操作,以確保即使輸入不具有完全相同的形狀,仍能有效進行操作。廣播可以透過四個規則來理解:

  1. 所有輸入數組都ndimopen in new window小於最大的輸入數組,ndimopen in new window其形狀前面有1個。

  2. 輸出形狀的每個維度的大小是該維度中所有輸入大小的最大值。

  3. 如果輸入在特定維度中的大小與該維度中的輸出大小匹配,或者其值正好為1,則可以在計算中使用該輸入。

  4. 當形狀尺寸為1時,該維度中的第一個資料條目將被用於所有沿該維度的計算。換句話說,ufuncopen in new window的步進機械 將不會沿著該維度步進(對於該維度,步幅將為0)。

        整個NumPy使用廣播決定如何處理不同形狀的陣列; 例如,所有算術運算( , -* 之間,...)ndarraysopen in new window的陣列操作之前廣播。

        如果上述規則產生有效結果,則將一組陣列稱為「可廣播」到相同的形狀, 即 滿足下列條件之一:

  • 陣列都具有完全相同的形狀。

  • 陣列都具有相同的維數,每個維度的長度是公共長度或1。

  • 尺寸太小的陣列可以使其形狀前置為長度為1的尺寸以滿足屬性2。

        如果a.shape是(5,1),b.shape是(1,6),c. shape是(6,)並且d.shape是() 使得 d 是標量,則 a , b , c 和 d 都可以廣播到維度(5, 6); 和:

  • a 的作用類似(5,6)數組,其中[:, 0] 廣播到其他列,

  • b 的作用類似於(5,6)數組,其中b[0, :] 廣播到其他行,

  • c被视为类似于一个(1,6)的矩阵,因此类似于一个(5,6)的矩阵,其中c的每一项元素被广播到每一行,最终,...

  • d 的作用类似于(5,6)数组,其中重复单个值。

四、函数格式

        可以在通用函数 (ufunc) 的文档中找到有关 ufunc 的详细说明。

         调用ufuncs格式

        op( *x[, out], where=True, **kwargs)

将 op 应用于参数 *x elementwise,广播参数。

广播规则是:

长度为 1 的维度可以添加到任一数组之前。

数组可以沿长度为 1 的维度重复。

参数:

        *xarray_like

        outndarray,None,或 ndarray 和 None 的元组,可选

        用于放置结果的备用数组对象;如果提供,它必须具有输入广播的形状。数组元组(可能仅作为关键字参数)的长度必须等于输出的数量;对 ufunc 分配的未初始化输出使用 None。

        wherearray_like,可选

        此条件通过输入广播。当条件为 True 时,ufunc 的结果将被赋值给 out 数组。在其他地方,out 数组将保留其原始值。请注意,如果通过默认 out=None 创建未初始化的 out 数组,则其中条件为 False 的位置将保持未初始化状态。

五、示例详解 

5.1 用输出参数

a = np.array([2,4,5,6])
b = np.array([2,2,3,3])
c = np.zeros((4,))
np.add(  a,b,c )
print( c )

5.2 行数组和列数组 

a = np.arange(3)
b = np.arange(3)[:, np.newaxis]
 
print(a)
print(b)

输出: 

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

5.3 广播规则示例

a = np.arange(3)
b = np.arange(3)[:, np.newaxis]
 
print(a)
print(b)
 
s = a + b
print(s)

六、ufunc后的数列运算

6.1 数列运算

在执行ufunc运算后,常常伴随数列运算,它们如下

__call__(*args, **kwargs)

Call self as a function.

accumulate(array[, axis, dtype, out])

Accumulate the result of applying the operator to all elements.

at(a, indices[, b])

Performs unbuffered in place operation on operand 'a' for elements specified by 'indices'.

outer(A, B, /, **kwargs)

Apply the ufunc op to all pairs (a, b) with a in A and b in B.

reduce(array[, axis, dtype, out, keepdims, ...])

Reduces array's dimension by one, by applying ufunc along one axis.

reduceat(array, indices[, axis, dtype, out])

Performs a (local) reduce with specified slices over a single axis.

resolve_dtypes(dtypes, *[, signature, ...])

Find the dtypes NumPy will use for the operation.

6.2 累计模式

累计模式不可以单独使用,而是与add以及multiply搭配使用:

np.add.accumulate([2, 3, 5])
array([ 2,  5, 10])
np.multiply.accumulate([2, 3, 5])
array([ 2,  6, 30])
np.add.accumulate(I, 0)
array([[1.,  0.],
       [1.,  1.]])
np.add.accumulate(I) # no axis specified = axis zero
array([[1.,  0.],
       [1.,  1.]])

6.3 对数组中某个index的元素进行局部处理 

         1)   将项目 0 和 1 设置为负值:

a = np.array([1, 2, 3, 4])
np.negative.at(a, [0, 1])
print( a )
array([-1, -2,  3,  4])

         2)  递增项目 0 和 1,递增项目 2 两次:

a = np.array([1, 2, 3, 4])
np.add.at(a, [0, 1, 2, 2], 1)
print( a )
array([2, 3, 5, 4])

         3) 将第一个数组中的项 0 和 1 添加到第二个数组,并将结果存储在第一个数组中:

a = np.array([1, 2, 3, 4])
b = np.array([1, 2])
np.add.at(a, [0, 1], b)
print(a)
array([2, 4, 3, 4])

 6.4 outer外积

简单数组外积

np.multiply.outer([1, 2, 3], [4, 5, 6])
array([[ 4,  5,  6],
       [ 8, 10, 12],
       [12, 15, 18]])

张量的外积 

A = np.array([[1, 2, 3], [4, 5, 6]])
A.shape
(2, 3)
B = np.array([[1, 2, 3, 4]])
B.shape
(1, 4)
C = np.multiply.outer(A, B)
C.shape; C
(2, 3, 1, 4)
array([[[[ 1,  2,  3,  4]],
        [[ 2,  4,  6,  8]],
        [[ 3,  6,  9, 12]]],
       [[[ 4,  8, 12, 16]],
        [[ 5, 10, 15, 20]],
        [[ 6, 12, 18, 24]]]])

 6.5 reduce方法

a = np.multiply.reduce([2,3,5])
print( a)
30
X = np.arange(8).reshape((2,2,2))
X
array([[[0, 1],
        [2, 3]],
       [[4, 5],
        [6, 7]]])
np.add.reduce(X, 0)
array([[ 4,  6],
       [ 8, 10]])
np.add.reduce(X) # confirm: default axis value is 0
array([[ 4,  6],
       [ 8, 10]])
np.add.reduce(X, 1)
array([[ 2,  4],
       [10, 12]])
np.add.reduce(X, 2)
array([[ 1,  5],
       [ 9, 13]])

您可以使用 initial 关键字参数以不同的值初始化缩减,以及在何处选择要包含的特定元素:

np.add.reduce([10], initial=5)
15
np.add.reduce(np.ones((2, 2, 2)), axis=(0, 2), initial=10)
array([14., 14.])
a = np.array([10., np.nan, 10])
np.add.reduce(a, where=~np.isnan(a))
20.0
np.minimum.reduce([], initial=np.inf)
inf
np.minimum.reduce([[1., 2.], [3., 4.]], initial=10., where=[True, False])
array([ 1., 10.])
np.minimum.reduce([])
Traceback (most recent call last):

以上是Python中的numpy.ufunc函數怎麼使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除