在dtype obj的NumPy数组中查找缺失值

时间:2014-09-09 20:30:43

标签: python arrays for-loop numpy nan

我被一个带有缺失值的NypPy数组obj驱使疯狂(在下面的示例中,它是倒数第二个值)。

>> a
array([0, 3, 'Braund, Mr. Owen Harris', 'male', 22.0, 1, 0, 'A/5 21171',
       7.25, nan, 'S'], dtype=object)

我想以编程方式找到这个缺失值,该函数返回一个布尔向量,其中True值的元素对应于数组中的缺失值(如下例所示)。

>> some_function(a)
array([False, False, False, False, False, False, False, False, False, True, False],
      dtype=bool)

我试过isnan无济于事。

>> isnan(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: ufunc 'isnan' not supported for the input types, and the inputs could not
be safely coerced to any supported types according to the casting rule ''safe''

我还尝试使用apply_along_axis在数组的每个元素上显式执行操作,但返回相同的错误。

>> apply_along_axis(isnan, 0, a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: ufunc 'isnan' not supported for the input types, and the inputs could not
be safely coerced to any supported types according to the casting rule ''safe''

任何人都可以向我解释(1)我做错了什么,以及(2)我能做些什么来解决这个问题?从错误中,我认为它与其中一个不合适类型的元素有关。解决这个问题的最简单方法是什么?

2 个答案:

答案 0 :(得分:3)

另一种解决方法是:

In [148]: [item != item for item in a]
Out[148]: [False, False, False, False, False, False, False, False, False, True, False]

NaNs are not equal to themselves以来。但请注意,可以定义自定义对象,如NaN,它们不等于它们自己:

class Foo(object):
    def __cmp__(self, obj):
        return -1
foo = Foo()
assert foo != foo

所以使用item != item并不一定意味着item是NaN。


请注意,如果可能,通常最好避免使用dtype object的NumPy数组。

  • 它们的内容并不是特别快 - 操作 通常在底层Python对象上转换为Python调用。一般 Python列表通常具有更好的性能。
  • 与数字数组不同,数字数组比Python数字列表更节省空间,因为每个项目都是一个对象数组不是特别节省空间 引用Python对象。
  • 由于许多NumPy操作,它们也不是特别方便 不适用于dtype object的数组。 isnan就是这样一个例子。

答案 1 :(得分:0)

我明白了!列表理解是要走的路。

问题来自于isnan无法在字符串上调用的事实。因此,诀窍是迭代元素,对任何非类型字符串的元素执行isnan操作。

[isnan(i) if type(i) != str else False for i in a]