是否可以在numexpr中对多个轴求和?

时间:2014-12-14 00:03:14

标签: python arrays numpy numexpr

我正在尝试执行以下操作:

import numexpr as ne

a = np.random.rand(10, 1)
b = np.random.rand(1, 10)
ne.NumExpr('sum(sum(a*b, 1), 0)').run(a, b) # <- error: reduction operations must occur last
ne.NumExpr('sum(a*b, [1, 0])').run(a, b) # <- error: ValueError: cannot encode axis

返回此处记录的错误:

https://github.com/pydata/numexpr/wiki/Numexpr-Users-Guide#supported-reduction-operations

我想知道是否有一个我没想到的解决方法。

修改

回答一些意见:

这是一个比我感兴趣的实际例子更简单的例子。这里有一个更完整的例子:

How to sum of squares of sum with memory limitations?

在这里:

How to do a sum of sums of the square of sum of sums?

我不希望你读完这些问题。

我对numexpr实现感兴趣的主要原因是,与我见过的任何其他内容相比,它为多线程提供了简单的支持,并且减少运算符减少了对内存存储的需求在我的情况下至关重要。

我希望这可以解决一些问题。

2 个答案:

答案 0 :(得分:0)

如何使用两个表达式?

import numpy as np
import numexpr as ne

a = np.random.rand(10, 1)
b = np.random.rand(1, 10)
ab = ne.evaluate('sum(a*b, 0)') # Calculates sum over first axis
print ne.evaluate('sum(ab, 0)') # <- Calculates sum over summed axis

我不确定这是否适合您,但这样可以避免在numexpr中使用函数/总和。

答案 1 :(得分:0)

您可以使用 numexpr 对多个轴求和,如下所示:

import numpy as np
import numexpr as ne

a = np.random.rand(10, 1)
b = np.random.rand(1, 10)
ne.evaluate('sum(x, 0)', {'x': ne.evaluate('sum(a*b, 1)')})