在python中忽略numpy bincount中的NaN

时间:2014-06-14 12:06:30

标签: python numpy nan

我有一维数组,我想使用numpy bincount来创建直方图。它工作正常,但我希望它忽略NaN值。

histogram = np.bincount(distancesArray, weights=intensitiesArray) / np.bincount(distancesArray)

我该怎么做?

感谢您的帮助!

3 个答案:

答案 0 :(得分:5)

以下是我认为您的问题所在:

import numpy

w = numpy.array([0.3, float("nan"), 0.2, 0.7, 1., -0.6]) # weights
x = numpy.array([0, 1, 1, 2, 2, 2])
numpy.bincount(x,  weights=w)
#>>> array([ 0.3,  nan,  1.1])

解决方案就是使用索引来仅保留非纳米权重:

keep = ~numpy.isnan(w)
numpy.bincount(x[keep],  weights=w[keep])
#>>> array([ 0.3,  0.2,  1.1])

答案 1 :(得分:2)

在整数值数组中不能有NaN。如果您尝试拨打np.bincount,则会抱怨:

TypeError: Cannot cast array data from dtype('float64') to dtype('int64') according to the rule 'safe'

如果您进行投射(.astype(int)),您将获得疯狂的值,例如-9223372036854775808。您可以通过选择非NaN值来克服此问题:

mask = ~np.logical_or(np.isnan(distancesArray), np.isnan(intensitiesArray))
histogram = np.bincount(distancesArray[mask].astype(int), 
                        weights=intensitiesArray[mask])

答案 2 :(得分:0)

您可以将其转换为pandas系列并删除空值。

ds = pd.Series(distancesArray)
ds = ds[ds.notnull()]   #returns non nullvalues