我有一个存储为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步骤。