如何在任意数组维度上映射函数(不使用列表推导)?

时间:2017-05-12 02:40:13

标签: python arrays numpy

我正在尝试使用numpy数组,我遇到了以下问题。我试图找到一种方法来映射一个函数,该函数将矩阵作为输入数组,以便该函数应用于两个或多个矩阵的成对元素,其中这些元素是数组。

var nodesArray = [].slice.call(document.querySelectorAll('li'));

列表推导的问题在于,我担心它们效率低下,因为它们是Python功能而不是Numpy功能。

2 个答案:

答案 0 :(得分:2)

您可以将xy相乘,然后按行对结果求和:

(x * y).sum(1)
# array([12665, 10625, 10619,  2492,  8681])

或使用numpy.einsum

np.einsum("ij,ij->i", x, y)
# array([12665, 10625, 10619,  2492,  8681])

答案 1 :(得分:1)

如果该函数是仲裁函数,那么您可能必须使用列表推导或某些等效迭代

z = [f(row_x, row_y) for row_x, row_y in zip(x,y)]

其中xy是(n,m)数组,而z将是(n,?)

此迭代适用于xy的第一维,将数组视为数组列表。

正如你发现vectorize没有做你想做的事情,因为它在元素方面起作用,就是它传递标量,而不是行传递给函数。

正如另一个答案所示,很容易将dot产品表达为逐行工作的东西。尽可能采取这种方式。查看计算的组成部分,并询问哪些元素按元素逐行操作,逐行操作等。许多基本的数学函数都以这种方式工作。但有些操作仅适用于1d数组,例如uniquein1d

在尝试提出适用于任意函数的内容之前,请学习如何在更简单的情况下使用多维数组。你会以这种方式得到更多。