所以,我正在处理 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 手段来做到这一点的好方法吗?
您需要在这里计算一些事情:
首先获取整个数组的累加和:
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,))