对numpy ndarray变量切片求和

时间:2016-07-20 21:49:47

标签: python numpy

我有一个存储为ndarray的m×n矩阵。它本质上是一个时间序列,时间为行(有序),各种不同的数据流为列。我的第一个目标是确定任何这些列过零的点("交叉点"),这是我完成的:

crossings = (np.diff(np.sign(original_matrix), axis=0) != 0)*1

完成此操作后,我现在有了一个新的(稀疏)矩阵,在所有交叉点都有1s。我需要做的是取两个交叉点之间的原始矩阵的每个切片的总和。

具体来说,如果一列有i个交叉点,我需要返回列中的值之和,因为交叉i除以交叉i-1和交叉i-2之间的列中的值之和。如果没有交叉点,我需要返回0.

我看过boolean mask和sum.reduceat作为解决方案,看起来很有成效。但我对如何开始感到有些困惑。

更新

这是一个简化的例子(实际上矩阵将更像1000 x 1000)

#original matrix:

[[0.5, 0.5, 0.5],
 [0.5, -0.5, 0.5],
 [-0.5, 0.5, 0.5],
 [0.5, 0.5, 0.5],
 [0.5, -0.5, 0.5],
 [0.5, -0.5, 0.5]
]

#crossings:
crossings = (np.diff(np.sign(original_matrix), axis=0) != 0)*1

[[0, 0, 0],
 [0, 1, 0],
 [1, 1, 0],
 [1, 0, 0],
 [0, 1, 0],
 [0, 0, 0]
]

因此,对于第一列,我需要最后三行[3:5]的总和除以行[2]的值。对于第二列,我需要行[4:5]的总和除以行的总和[2:3]。对于第三列,我返回零。

我意识到我可以使用以下方法获取所有交叉点的索引:

indices = np.transpose(np.nonzero(crossings))

array([[1, 1],
       [2, 0],
       [2, 1],
       [3, 0],
       [4, 1]])

但是我很难弄清楚如何从这些指数转到sum.reduceat步骤。

0 个答案:

没有答案