计算numpy中所有起点/终点对的加权累积和

c9x0cxw0  于 2023-03-30  发布在  其他
关注(0)|答案(1)|浏览(198)

我有一个numpy数组signal,我试图计算以下值:

C = (signal[t_begin:t_end + 1] * (np.arange(t_end - t_begin + 1) + 1)).sum()

对于所有对t_begint_end,使得0〈= t_begin〈= t_endlen(signal),而不使用for循环。
我尝试生成所有可能的t_begint_end对,并以以下方式将它们用作signal中的索引:

t_begin_indices, t_end_indices = np.meshgrid(np.arange(2, n + 1), np.arange(2, n + 1), indexing='ij')
s = t_end_indices - t_begin_indices + 1
valid_mask = s > 0
s_valid = s[valid_mask]
C = signal[t_begin_indices[valid_mask]:t_end_indices[valid_mask]+1] * ((np.arange(s_valid) + 1)[:, np.newaxis])

但我得到了以下错误:TypeError: only integer scalar arrays can be converted to a scalar index

lsmd5eda

lsmd5eda1#

在文档中使用np.add. reduce:https://numpy.org/doc/stable/reference/generated/numpy.ufunc.reduceat.html
我之所以建议这样做,是因为你遇到的t_开始_indices和t_end_indices都是二维数组,但是切片操作信号[t_begin_indices[valid_mask]:t_end_indices[valid_mask]+1]期望的是一个一维的索引数组,而np.add. reduce有助于以向量化的方式执行求和。
请尝试以下操作:

t_begin_indices = np.arange(n-1)
t_end_indices = np.arange(1, n)
s = t_end_indices - t_begin_indices + 1
C = np.add.reduceat(signal[t_begin_indices] * (s + 1), t_end_indices)

相关问题