Python 如何有效地将函数按行应用于NumPy矩阵

Python 如何有效地将函数按行应用于NumPy矩阵,python,numpy,matrix,vectorization,Python,Numpy,Matrix,Vectorization,我想以一种有效的方式将一个函数应用于Numpy矩阵的每一行。我发现使用np.apply\u沿着矩阵(函数,1,数组)可以得到想要的结果。然而,这是难以置信的慢,特别是当使用非常大的矩阵 我知道将我的函数映射到矩阵行的更有效、更正确的方法是对其进行向量化,但我不知道如何正确地对该函数进行向量化(请注意,我不是指np.vectorize(function),因为这将应用于每个元素,而不是每行) 如何对该函数以及类似于此函数的函数进行矢量化以优化速度?您可以使用矢量化将函数f应用于二维数组 a*a.s

我想以一种有效的方式将一个函数应用于Numpy矩阵的每一行。我发现使用
np.apply\u沿着矩阵(函数,1,数组)
可以得到想要的结果。然而,这是难以置信的慢,特别是当使用非常大的矩阵

我知道将我的函数映射到矩阵行的更有效、更正确的方法是对其进行向量化,但我不知道如何正确地对该函数进行向量化(请注意,我不是指
np.vectorize(function)
,因为这将应用于每个元素,而不是每行)

如何对该函数以及类似于此函数的函数进行矢量化以优化速度?

您可以使用矢量化将函数f应用于二维数组

a*a.sum(axis=1,keepdims=True)

这里,我们沿着横轴(1)对数组
a
的元素求和,并将其设为列向量(keepdims),将
a
的每一行乘以和向量的相应元素

矢量化非常有效。你可以在网上了解更多

import numpy as np


def f(x):
    return x * x.sum() # Multiply each element of a vector by the sum of the vector


a = np.arange(10).reshape(2, 5)

b = np.apply_along_axis(f, 1, a)
print(b)
# [[  0  10  20  30  40]    Desired output
#  [175 210 245 280 315]]

c = f(a)
print(c)
# [[  0  45  90 135 180]    Incorrect output of trying to apply f to matrix a
#  [225 270 315 360 405]]