具有T行和列k的给定矩阵X
T = 50
H = 10
k = 5
X = np.arange(T).reshape(T,1)*np.ones((T,k))如何使用滞后H沿行轴执行X的滚动累积和
Xcum = np.zeros((T-H,k))
for t in range(H,T):
Xcum[t-H,:] = np.sum( X[t-H:t,:], axis=0 )注意,最好避免跨步和卷积,在广播/矢量化最佳实践下。
发布于 2014-08-28 02:38:25
听起来你需要以下几点:
import scipy.signal
scipy.signal.convolve2d(X, np.ones((H,1)), mode='valid')这当然使用卷积,但如上所述,问题是卷积操作。广播将导致更慢/内存密集型算法。
发布于 2014-08-28 05:54:38
您实际上在滚动求和中缺少最后一行,这将是正确的输出:
Xcum = np.zeros((T-H+1, k))
for t in range(H, T+1):
Xcum[t-H, :] = np.sum(X[t-H:t, :], axis=0)如果您需要仅使用numpy在任意轴上执行此操作,则最简单的方法是沿该轴执行np.cumsum,然后将结果计算为其中两个切片的差。使用示例数组和轴:
temp = np.cumsum(X, axis=0)
Xcum = np.empty((T-H+1, k))
Xcum[0] = temp[H-1]
Xcum[1:] = temp[H:] - temp[:-H]另一种选择是使用pandas和它的rolling_sum函数,它显然可以像你需要的那样在2D数组上工作:
import pandas as pd
Xcum = pd.rolling_sum(X, 10)[9:] # first 9 entries are NaN发布于 2014-08-28 12:32:02
这是一个步进式的解决方案。我知道这不是你想要的,但我想知道它如何比较。
def foo2(X):
temp = np.lib.stride_tricks.as_strided(X, shape=(H,T-H+1,k),
strides=(k*8,)+X.strides))
# return temp.sum(0)
return np.einsum('ijk->jk', temp)这一次是35我们,相比之下,詹姆的cumsum解决方案是22我们。einsum比sum(0)快一点。temp使用的是X的数据,所以没有内存损失,但更难理解。
https://stackoverflow.com/questions/25534440
复制相似问题