如何强制函数在不调用'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 Universal函数ufunc例如,请参见此处。这种表现优于np.vectorize,但效率仍然不如内置ufunc方法。

我想知道是否有任何有效的努力来处理此操作,即迫使该功能广播?

如果有一种更好的方法来制作任意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)之间的区别几乎可以忽略不计。

相关内容

最新更新