我正在使用numpy reduceat数据分箱方法。背景:我正在处理以高频采样的测量数据,我需要通过从一定大小的箱体中提取箱体均值来对它们进行下采样。由于我有数百万个样本,所以我需要一些快速的方法。原则上,这种方法非常有效:
numpy
reduceat
import numpy as np def bin_by_npreduceat(v, nbins): bins = np.linspace(0, len(v), nbins+1, True).astype(np.int) return np.add.reduceat(v, bins[:-1]) / np.diff(bins)
问题是:NaN 可能会出现(很少见,但确实会发生)。结果:整个 bin 将为 NaN,因为我使用了np.add:
np.add
v = np.array([1,np.nan,3,4,5,4,3,5,6,7,3,2,5,6,9]) bin_by_npreduceat(v, 3) Out[110]: array([nan, 5., 5.])
有人知道我该如何修复这个问题吗?np.nansum不幸的是没有reduceat......
np.nansum
我们可以使用一种masking基于的方法 -
masking
# Mask of NaNs mask = np.isnan(v) # Replace NaNs with zeros vn = np.where(mask,0,v) # Use add.reduceat on NaNs skipped array to get summations # Use add.reduceat on the mask to get valid counts # Divide them to get final output out = np.add.reduceat(vn, bins[:-1])/np.add.reduceat(~mask, bins[:-1])