當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python numpy vectorize用法及代碼示例


本文簡要介紹 python 語言中 numpy.vectorize 的用法。

用法:

class  numpy.vectorize(pyfunc, otypes=None, doc=None, excluded=None, cache=False, signature=None)

廣義函數類。

定義一個向量化函數,它將對象的嵌套序列或 numpy 數組作為輸入並返回單個 numpy 數組或 numpy 數組的元組。向量化函數在輸入數組的連續元組上評估 pyfunc,就像 python map 函數一樣,除了它使用 numpy 的廣播規則。

向量化輸出的數據類型是通過使用輸入的第一個元素調用函數來確定的。這可以通過指定 otypes 參數來避免。

參數

pyfunc 可調用的

python 函數或方法。

otypes str 或 dtypes 列表,可選

輸出數據類型。它必須指定為類型代碼字符串或數據類型說明符列表。每個輸出應該有一個數據類型說明符。

doc str,可選

函數的文檔字符串。如果沒有,文檔字符串將是 pyfunc.__doc__

excluded 設置,可選

表示函數不會被矢量化的位置或關鍵字參數的字符串或整數集。這些將直接傳遞給 pyfunc 未經修改。

cache 布爾型,可選

如果為 True,則緩存第一個函數調用,如果未提供 otypes,則確定輸出數量。

signature 字符串,可選

廣義通用函數簽名,例如,(m,n),(n)->(m) 用於矢量化matrix-vector 乘法。如果提供,pyfunc 將被調用(並期望返回)具有由相應核心尺寸的大小給出的形狀的數組。默認情況下,pyfunc 假定將標量作為輸入和輸出。

返回

vectorized 可調用的

向量化函數。

注意

提供 vectorize 函數主要是為了方便,而不是為了性能。該實現本質上是一個 for 循環。

如果未指定 otypes,則使用第一個參數調用函數來確定輸出的數量。如果緩存為 True,則此調用的結果將被緩存,以防止調用該函數兩次。但是,要實現緩存,必須將原始函數包裝起來,這會減慢後續調用的速度,所以隻有在你的函數很昂貴時才這樣做。

新的關鍵字參數接口和排除參數支持進一步降低了性能。

參考

1

通用通用函數 API

例子

>>> def myfunc(a, b):
...     "Return a-b if a>b, otherwise return a+b"
...     if a > b:
...         return a - b
...     else:
...         return a + b
>>> vfunc = np.vectorize(myfunc)
>>> vfunc([1, 2, 3, 4], 2)
array([3, 4, 1, 2])

除非指定,否則文檔字符串將從 vectorize 的輸入函數獲取:

>>> vfunc.__doc__
'Return a-b if a>b, otherwise return a+b'
>>> vfunc = np.vectorize(myfunc, doc='Vectorized `myfunc`')
>>> vfunc.__doc__
'Vectorized `myfunc`'

輸出類型是通過評估輸入的第一個元素來確定的,除非它被指定:

>>> out = vfunc([1, 2, 3, 4], 2)
>>> type(out[0])
<class 'numpy.int64'>
>>> vfunc = np.vectorize(myfunc, otypes=[float])
>>> out = vfunc([1, 2, 3, 4], 2)
>>> type(out[0])
<class 'numpy.float64'>

排除在外參數可用於防止對某些參數進行向量化。這對於固定長度的類似數組的參數很有用,例如多項式的係數,如下所示numpy.polyval

>>> def mypolyval(p, x):
...     _p = list(p)
...     res = _p.pop(0)
...     while _p:
...         res = res*x + _p.pop(0)
...     return res
>>> vpolyval = np.vectorize(mypolyval, excluded=['p'])
>>> vpolyval(p=[1, 2, 3], x=[0, 1])
array([3, 6])

位置參數也可以通過指定它們的位置來排除:

>>> vpolyval.excluded.add(0)
>>> vpolyval([1, 2, 3], x=[0, 1])
array([3, 6])

簽名參數允許對作用於固定長度的非標量數組的函數進行向量化。例如,您可以使用它來矢量化計算 Pearson 相關係數及其 p 值:

>>> import scipy.stats
>>> pearsonr = np.vectorize(scipy.stats.pearsonr,
...                 signature='(n),(n)->(),()')
>>> pearsonr([[0, 1, 2, 3]], [[1, 2, 3, 4], [4, 3, 2, 1]])
(array([ 1., -1.]), array([ 0.,  0.]))

或者對於矢量化卷積:

>>> convolve = np.vectorize(np.convolve, signature='(n),(m)->(k)')
>>> convolve(np.eye(4), [1, 2, 1])
array([[1., 2., 1., 0., 0., 0.],
       [0., 1., 2., 1., 0., 0.],
       [0., 0., 1., 2., 1., 0.],
       [0., 0., 0., 1., 2., 1.]])

相關用法


注:本文由純淨天空篩選整理自numpy.org大神的英文原創作品 numpy.vectorize。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。