如何在使用numpy add.reduceat进行装箱时处理NaN?

i5desfxk  于 2023-06-06  发布在  其他
关注(0)|答案(1)|浏览(142)

我使用numpyreduceat方法对数据进行分箱。背景:我正在处理以高频采样的测量数据,我需要通过从一定大小的bin中提取bin均值来对它们进行下采样。因为我有上百万的样本,我需要一些快的东西。原则上,这就像一种魅力:

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

monwx1rj

monwx1rj1#

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

相关问题