向量化Python中的累积和

问题描述:

我试图向量化/广播(不知道它是什么形式调用)我的代码,以使其更快,但我不明白。我认为我应该使用的是numpy.cumsum(axis = 0),但我不知道如何在正确的数组中使用它(快速)。向量化Python中的累积和

我想要的代码基本上是l1的绝对总和,用于将l2中的每个元素添加到l1中的所有数字。所以这不是一个答案,而是len(12)个答案。下面的(非矢量化)代码给出了正确的输出。

# l1 and l2 are numpy arrays 
    for i in l2: 
     l1 += i 
     answer = numpy.sum(numpy.absolute(l1)) 
     print answer 

任何人都可以提供答案或提示吗?

诀窍是首先将两个一维数组组合成一个单一的二维数组,然后对其进行求和。如果您有一个形状为(a,1)的矢量,并且您用形状为(b,)的阵列广播它,则生成的阵列将形状为(a,b)。在数组中添加长度为1的额外轴可以很方便地得到这种行为。

这里有一种方式来获得无环路

# Assume l1 has length n1, l2 has length n2 
suml2 = np.cumsum(l2) # length n2 
y = l1 + suml2[:,np.newaxis] # shape (n2, n1) 
answer = np.sum(np.abs(y), axis=1) # shape (n2,) 
+0

它的工作原理相同的答案,但它是稍微慢一些,或者使用大集时,给了我一个内存错误。 (l1和l2约100.000大)。这个内存错误来自'y = l1 + suml2 [:,np.newaxis]'。它会创建一个100.000矩阵我假设,这可能解释了内存错误(我使用64位python) – Exclu

+0

如果这是你的主要瓶颈,你可能想看看cython。请注意,如果你实际上并不需要'abs',你可以用代数将它重写为'answer = np.sum(l1)+ np.cumsum(l2)'。在进行这种广播和缩减时,Numpy往往会成为一种记忆体。 – clwainwright

+0

这个较短的表达式(没有'abs')实际上是(通过我的测试)'np.sum(l1)+ len(l1)* np.cumsum(l2)'。无论如何,如果没有'abs',这是一个简单的线性计算。 – hpaulj