[英]How to force a function to broadcast without invoking `np.vectorize`
我想找一種強制廣播功能的方法。
在某些情況下,可以在稍后的實例中覆蓋函數/方法,以實現恆定的功能。 在這種情況下,如果
arr = np.arange(0, 1, 0.0001)
f = lambda x: 5
f(arr) # this gives just integer 5, i want [5, 5,..., 5]
我知道像強制函數廣播的np.vectorize
這樣的方法,但問題是這是低效的,因為它本質上是針對循環的循環。 (見文件 )
我們也可以使用像np.frompyfunc
這樣的工廠方法,它允許我們將python函數轉換為numpy通用函數ufunc
。例如,請參見此處 。 這比np.vectorize
,但仍然比內置的ufunc
方法效率低。
我想知道是否有任何有效的numpy方式處理這個,即強制廣播功能?
如果有更好的方法來制作任意Python函數廣播, numpy.vectorize
將使用它。 如果你想要有效地廣播,你真的必須用廣播來編寫這個功能。
在常量函數的特定情況下,您可以使用numpy.full
編寫廣播常量函數:
def f(x):
return numpy.full(numpy.shape(x), 5)
numba.vectorize
還可以比numpy.vectorize
更有效地向量化函數,但是你需要Numba,並且需要以Numba可以有效編譯的方式編寫函數。
對於那些沒有通用答案的人來說,最好的答案是np.full_like(arr, val)
,比np.full(arr.shape, val)
提高約20%
在將這個問題提交給作者之后,我發現了一些最佳的中間立場,它既具有普遍性,又表現得相當好:
np.broadcast_arrays(x, f(x))[1]
這里有一些時間分析:
arr = np.arange(1, 2, 0.0001).reshape(10, -1)
def master_f(x): return np.broadcast_arrays(x, f(x))[-1].copy('K')
def master_f_nocopy(x): return np.broadcast_arrays(x, f(x))[-1]
def vector_f(x): return np.vectorize(f)(x)
%timeit arr+1 # this takes about 10microsec
%timeit master_f(arr) # this takes about 40 mircrosec
%timeit master_f_nocopy(arr) # this takes about 20 microsec
注意,這允許應用於投影函數,例如f(x,y):=y
,這超出了np.full_like
的幫助。
此外,當它出現更復雜的功能,如np.sin
和np.cos
你會注意到f(arr)
和master_f_nocopy(arr)
之間的差異幾乎可以忽略不計。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.