【发布时间】:2016-09-01 15:37:31
【问题描述】:
假设我有一个 n x m 矩阵,并且想在它的每个元素上调用一个函数 fct。我可以这样做:
A = numpy.array(...)
vec_func = numpy.vectorize(fct)
A_out = vec_func(A)
这将严格地将函数应用于每个矩阵元素,fct 将是一个函数:
def fct(a_ij):
# do something with matrix element a(i, j)
现在我想要相同的,但对于矩阵的每一行:
def fct(row_i):
# do something with matrix row(i)
有没有办法用numpy.vectorize 或类似的方法来做到这一点?
【问题讨论】:
-
我刚刚读到:“提供 vectorize 函数主要是为了方便,而不是为了性能。实现本质上是一个 for 循环。”所以这个函数反正也没那么有用。
-
没有“功能无关”的矢量化方法可以显着提高性能(如您所见,
np.vectorize只是语法糖)。您可以重新编写fct以接受数组作为输入参数,或者切换到已编译的实现(例如 Cython、numba)。 -
要添加到@ali_m 的建议,您可以尝试 numba 的广义 ufunc numba.pydata.org/numba-doc/dev/user/…。除了速度提升之外,它还可以实现您想要的智能广播。
标签: python performance numpy scipy vectorization