簡體   English   中英

如何在不調用`np.vectorize`的情況下強制播放函數

[英]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.sinnp.cos你會注意到f(arr)master_f_nocopy(arr)之間的差異幾乎可以忽略不計。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM