Numpy 信号处理:有效总结连续非零元素的子数组

问题描述 投票:0回答:1

所以,我正在处理 FFT 数据,当彻底清理后,这些数据应该看起来像很多很多零和偶尔很大的数字。我现在拥有的是许多零和偶尔的较大数字的短子数组。举个例子,

ydata=np.array([0,0,0,0,1,2,3,0,0,9,3, 1, 0, 2, 9, 0])
xdata=np.array([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15])

我使用连续整数数组作为 xdata,但这些值可以是任何严格递增数字的序列。

我想做的是将所有当前 y 值设置为 0 并添加与非零子数组对应的值。对于每个子数组,y 值应该是子数组中元素的总和,并且它应该是最接近子数组索引加权和的索引。

举个例子,ydata中连续非零元素的第一个子数组是[1,2,3],对应的x值是[4,5,6]。 y 值的总和是 6,x 值的加权和是 (4+10+18)/6,四舍五入到 5。按照这个模式我想得到。

ydata=np.array([0,0,0,0,0,6,0,0,0,13,0, 0, 0, 0, 11, 0])
xdata=np.array([0,1,2,3,4,5,6,7,8,9, 10,11,12,13,14,15])

我可以使用非 numpy 迭代来完成此操作,但这对于我正在使用的数据大小来说是不切实际的。有人知道通过 numpythonic 手段来做到这一点的好方法吗?

python arrays numpy signal-processing
1个回答
0
投票

您需要在这里计算一些事情:

首先获取整个数组的累加和:

cs = np.cumsum(ydata)

接下来,找到当前元素非零、下一个元素为零且累积和不为零的位置:

filter_locs = (ydata != 0) & (cs != 0)
filter_locs[:-1] = filter_locs[:-1] & (ydata[1:] == 0) 

新值可以从这些位置的累积和中得出:

new_values = cs[filter_locs]
new_values[1:] -= new_values[:-1]

我们可以对

xdata * ydata
进行类似的操作来获取索引:

cs_x = np.cumsum(xdata * ydata)
weighted_totals = cs_x[filter_locs]
weighted_totals[1:] -= weighted_totals[:-1]

new_indices = np.round(weighted_totals / new_values).astype(int)

最后,在零数组中设置索引:

new_data = np.zeros_like(ydata)
new_data[new_indices] = new_values

这给了我们想要的数组:

array([ 0,  0,  0,  0,  0,  6,  0,  0,  0, 13,  0,  0,  0,  0, 11,  0])

如果

xdata
不是索引数组,则输出数组中的最大可能索引是
xdata
的最大值,因此不要使用
new_data = np.zeros_like(ydata)
,而是执行以下操作:

max_possible_index = int(np.round(xdata.max()))
new_data = np.zeros((max_possible_index+1,))
© www.soinside.com 2019 - 2024. All rights reserved.