Numpy:平均计算结果为nan值

时间:2013-11-27 18:41:26

标签: python arrays numpy nan

我有一组值x:

 x=numpy.array([[-0.11361818  -0.113618185  -0.98787775  -0.09719566],
 [-0.11361818  -0.04173076 -0.98787775  -0.09719566],
 [-0.11361818  -0.04173076 -0.98787775  -0.09719566],
 [-0.62610493  -0.71682393 -0.24673653  -0.18242028],
 [-0.62584854  -0.71613061 -0.24904998  -0.18287883],
 [-0.62538661  -0.71551038 -0.25160676  -0.18338629]])

和一组相应的类标签y:

y=numpy.array([1, 1, 2, 3, 4, 4])

y中的第一个类标签1属于数组x中的第一行,y中的第二个类标签1属于数组x中的第二行,依此类推。

现在我想计算每个1-4级的平均值。例如,x中的第1行和第2行都属于第1类,因此我计算第1行和第2行的平均值。

我有以下代码:

means = numpy.array([x[y == i].mean(axis=0) for i in xrange(4)])

当我这样做时,我最终得到了这个结果:

array([[        nan],
       [-1.27636606],
       [-1.24042235],
       [-1.77208567]])

如果我采用xrange(6),我有这个结果:

array([[        nan],
       [-1.27636606],
       [-1.24042235],
       [-1.77208567],
       [-1.774899  ],
       [        nan]])

为什么会出现这种情况?如何摆脱nans并最终得到我的4个均值?

我有来自here的代码,他们把类的数量作为xrange()的参数,我不太清楚我做了什么不同的事情。

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:4)

xrange(4)会产生值[0, 1, 2, 3]means中的第一个值为nan,因为您的y值不等于零。

相反,请执行:

In [49]: means = numpy.array([x[y == i].mean(axis=0) for i in xrange(1, 5)])

In [50]: means
Out[50]: 
array([[-1.27636606],
       [-1.24042235],
       [-1.77208567],
       [-1.774899  ]])

答案 1 :(得分:0)

您应该使用xrange(1,5)来避免值0。