如何使用 numpy add.reduceat 处理分箱中的 NaN?

How to handle NaNs in binning with numpy add.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:

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...

我们可以使用基于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])