我有一个向量,其信号值为1
或-1
。我想要第二个向量,它计算具有相同值的连续信号的累积和,并在每次信号改变时重新启动累积和。以下是一个例子:
signal = [1 1 1 -1 -1 -1 -1]
cum_sum = [1 2 3 -1 -2 -3 -4]
我需要计算大量数据,希望尽可能高效地进行计算。 我的代码现在可以完成这项工作,但它需要时间,而且没有利用numpy的效率:
import numpy as np
# Signal values to be analyzed
signal = np.array([1,1,1,-1,-1,-1,-1], dtype=int)
# Vector with previous value of signal
signal_prev = signal[:-1]
signal_prev = np.pad(signal_prev,(1,0), mode='constant', constant_values=(0))
#Array with signal values in first column and previous values in second column
arr = np.array([signal,signal_prev], dtype=int)
arr = np.transpose(arr)
print(arr)
""" Array with signal values and previous values
[[ 1 0]
[ 1 1]
[ 1 1]
[-1 1]
[-1 -1]
[-1 -1]
[-1 -1]]
"""
#create an empty array to append cumulative sum
signal_sum = np.array([], dtype=int)
# compute the cumulative sum iterating row by row
for x in arr:
if np.sign(x[0]*x[1]) > 0:
signal_sum = np.append(signal_sum, signal_sum[-1] + x[1])
else:
signal_sum= np.append(signal_sum, x[0])
arr_sum = np.array([signal, signal_sum])
arr_sum = np.transpose(arr_sum)
print(arr_sum)
""" Array with signal values and cumulative sum restarted with signal change
[[ 1 1]
[ 1 2]
[ 1 3]
[-1 -1]
[-1 -2]
[-1 -3]
[-1 -4]]
"""
我相信使用numpy函数或lambda函数可以更有效地进行此计算。我不是程序员,而且我是Python新手。我想知道这是否可以做得更快
对于快速、完全矢量化的方式(无循环),您可以使用常规的
np.cumsum()
,但在数组的副本上,您可以在每个组的开头减去上一个组的和:例如:
对于大型阵列,节省的时间非常可观:
n
的数组中k
组是O(n + k)
(不同于O(n * k)
的其他解决方案)李>试试这个:
不知怎的,在我开始之前,这在我的脑海里看起来更容易。幸运的是,与此同时,其他人已经提出了解决方案。因此,是时候将我的解决方案与其他解决方案进行比较了:
首先,让我们检查它们是否都返回相同的结果。事实证明,sai的解决方案有时会生成错误的数组:
现在,较短阵列的计时:
和更长的阵列:
因此,Pierre D的建议是您的最佳选择(到目前为止)
2种可能的方法
sawtooth1
使用与@sai相同的思想两者的时间差是微不足道的
相关问题 更多 >
编程相关推荐