小能豆

关于python:如何在使用numpy add.reduceat进行分箱时处理NaN?

py

我正在使用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......


阅读 13

收藏
2025-01-03

共1个答案

小能豆

我们可以使用一种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])
2025-01-03