您好,登錄后才能下訂單哦!
這篇“Python中的numpy.ufunc函數怎么使用”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Python中的numpy.ufunc函數怎么使用”文章吧。
numpy.ufunc是什么函數?答曰:就是numpy的函數,因為numpy針對的是數組張量,因此,幾乎每一個函數都是ufunc。
在整個數組上逐個元素地操作的函數。因此,ufunc是個泛指,這些函數為數眾多。
通用函數(或簡稱 ufunc)是一種以逐個元素的方式對 ndarrays 進行操作的函數,支持數組廣播、類型轉換和其他一些標準功能。也就是說,ufunc 是函數的“矢量化”包裝器,它采用固定數量的特定輸入并產生固定數量的特定輸出。有關通用函數的詳細信息,請參閱通用函數 (ufunc) 基礎知識。
在NumPy中,通函數是numpy.ufunc
類的實例 。 許多內置函數都是在編譯的C代碼中實現的。 基本的ufuncs對標量進行操作,但也有一種通用類型,基本元素是子數組(向量,矩陣等), 廣播是在其他維度上完成的。也可以ufunc
使用frompyfuncopen in new window工廠函數生成自定義實例。
該函數表述出對應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
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 )
表明一個ufunc的輸入數據類型格式:ufunc 可以操作的數字 NumPy 類型的數量——總共有 18 種。
np.add.ntypes 18 np.multiply.ntypes 18 np.power.ntypes 17 np.exp.ntypes 7 np.remainder.ntypes 14
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']
表明維度的參數有兩個,array.ndim 和 array.shape,其中ndim是指張量共幾個維度,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的向量或更高階子數組)。 應用標準廣播規則,以便仍然可以有效地操作不共享完全相同形狀的輸入。 廣播可以通過四個規則來理解:
所有輸入數組都ndimopen in new window小于最大的輸入數組,ndimopen in new window其形狀前面有1個。
輸出形狀的每個維度的大小是該維度中所有輸入大小的最大值。
如果輸入在特定維度中的大小與該維度中的輸出大小匹配,或者其值正好為1,則可以在計算中使用該輸入。
如果輸入的形狀尺寸為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 的位置,out 數組將設置為 ufunc 結果。在其他地方,out 數組將保留其原始值。請注意,如果通過默認 out=None 創建未初始化的 out 數組,則其中條件為 False 的位置將保持未初始化狀態。
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運算后,常常伴隨數列運算,它們如下
__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. |
累計模式不可以單獨使用,而是與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.]])
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])
簡單數組外積
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]]]])
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函數怎么使用”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。