首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何沿矩阵轴进行滚动求和?

如何沿矩阵轴进行滚动求和?
EN

Stack Overflow用户
提问于 2014-08-28 02:23:40
回答 3查看 931关注 0票数 4

具有T行和列k的给定矩阵X

代码语言:javascript
复制
T = 50
H = 10
k = 5 
X = np.arange(T).reshape(T,1)*np.ones((T,k))

如何使用滞后H沿行轴执行X的滚动累积和

代码语言:javascript
复制
Xcum = np.zeros((T-H,k))
for t in range(H,T):
    Xcum[t-H,:] = np.sum( X[t-H:t,:], axis=0 )

注意,最好避免跨步和卷积,在广播/矢量化最佳实践下。

EN

回答 3

Stack Overflow用户

发布于 2014-08-28 02:38:25

听起来你需要以下几点:

代码语言:javascript
复制
import scipy.signal
scipy.signal.convolve2d(X, np.ones((H,1)), mode='valid')

这当然使用卷积,但如上所述,问题是卷积操作。广播将导致更慢/内存密集型算法。

票数 3
EN

Stack Overflow用户

发布于 2014-08-28 05:54:38

您实际上在滚动求和中缺少最后一行,这将是正确的输出:

代码语言:javascript
复制
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,然后将结果计算为其中两个切片的差。使用示例数组和轴:

代码语言:javascript
复制
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数组上工作:

代码语言:javascript
复制
import pandas as pd
Xcum = pd.rolling_sum(X, 10)[9:] # first 9 entries are NaN
票数 1
EN

Stack Overflow用户

发布于 2014-08-28 12:32:02

这是一个步进式的解决方案。我知道这不是你想要的,但我想知道它如何比较。

代码语言:javascript
复制
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我们。einsumsum(0)快一点。temp使用的是X的数据,所以没有内存损失,但更难理解。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25534440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档