如何在numpy数组中获取所有NaN值的索引列表?

128

现在假设我有一个numpy数组,它被定义为:

[[1,2,3,4],
[2,3,NaN,5],
[NaN,5,2,3]]

现在我想要一个包含所有缺失值索引的列表,在这种情况下是[(1,2),(2,0)]

有没有办法可以做到这一点?

4个回答

218

np.isnannp.argwhere结合使用。

x = np.array([[1,2,3,4],
              [2,3,np.nan,5],
              [np.nan,5,2,3]])
np.argwhere(np.isnan(x))

输出:

array([[1, 2],
       [2, 0]])

1
如何对一个由浮点数值组成的数组执行同样的操作? - Deepraj Chanda
1
argwhere 真是太棒了!不过我有一个附加问题。由于它返回索引列表,是否有任何方法在 numpy 中将这些索引合并成最小的切片列表。例如,我得到 [[1,1],[1,2],[1,3],[3,8],[4,8],[5,8]],希望得到 [[1,1:4],[3:6,8]],主要是因为我的数据没有很好的窗口,而且索引列表非常大。 - Bernd Wechner

23
你可以使用np.where来匹配数组中对应于Nan值的布尔条件,并映射每个结果以生成一个tuples列表。
>>>list(map(tuple, np.where(np.isnan(x))))
[(1, 2), (2, 0)]

我认为你想要的是 list( zip(* map( list, np.where(np.isnan(x) ) ) ) ) - travelingbones

18

由于x!= x返回与np.isnan(x)相同的布尔数组(因为np.nan!= np.nan将返回True),您还可以编写:

np.argwhere(x!=x)

但是,我仍然建议编写np.argwhere(np.isnan(x)),因为它更易读。我只是尝试在此答案中提供另一种编写代码的方式。


-1
另一种方法是使用np.ma.masked_invalid(x)。如果你只想让numpy在有效值上进行操作,这是一种更简单的方式。例如,
x = np.ones((2,2))
x[(0,0)] = np.nan
x = np.ma.masked_invalid(x)
np.sum(x)

返回3

1
这并没有回答楼主的问题。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接