Python中的系列求和

时间:2018-03-29 09:11:33

标签: python python-2.7 numpy

我有一个5 000 000个元素的1D矩阵(A),我想对这些数据进行一系列求和,以便结果(矩阵" B")也是5 000 000个元素long 1D矩阵,其中每个元素B [i]是元素A [i]和A [i]之前的所有元素之和。

以下代码是我目前所拥有的。该代码并没有完全削减它,因为系列中每个求和的运行时间随着求和的数量(索引值)而减少,直到该过程在完成之前终止自身(即,在达到第500万个索引之前)。 / p>

是否有更有效的方式来总结这么长的系列?是否有一个python函数可以做到这一点?

import numpy as np
# Create the fake data:
A = np.arange(5000000)
B = np.zeros([5000000])
for i in np.arange(5000000):
    B[i] = np.sum(A[0:i])

2 个答案:

答案 0 :(得分:6)

您所描述的内容称为累积求和,NumPy具有内置函数:

B = np.cumsum(A)

如果您想自己编写,则应使用属性B[i] = B[i-1] + A[i]。也就是说,i'总和与(i-1)'总和加i'A'值相同:

B = np.zeros(5000000)
for i in xrange(1, 5000000):
    B[i] = B[i-1] + A[i]

这具有O(n)复杂度,而不是你问题中算法的O(n²)。另请注意,我使用了xrange而不是np.arange。执行循环时这更好,因为xrange一次生成一个整数,这意味着它比np.arange消耗的内存更少。

答案 1 :(得分:3)

你可以利用B[i-1]是它之前所有数字之和的事实。这意味着下一个元素(B[i])只是B[i-1]+A[i]。这样可以在迭代期间将A[0]迭代到A[i]

这是一个可以执行此操作的函数:

def sumMatrix(A):
    #Define the return array, B, populated with 0
    B = [0]
    #Iterate through the provided array, A
    for number in A:
        #Set the next element to the sum of the last element in B
        #  and the next number in A
        B.append(B[-1] + number)
    #Return B, removing the 0 in the first element
    return B[1:]

#Call the function with the numbers from 1 to 5,000,000 and output
#  the result
print(sumMatrix(range(5000000)))

希望这会有所帮助:)