我被一个带有缺失值的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)我能做些什么来解决这个问题?从错误中,我认为它与其中一个不合适类型的元素有关。解决这个问题的最简单方法是什么?
答案 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数组。
object
的数组。 isnan
就是这样一个例子。答案 1 :(得分:0)
我明白了!列表理解是要走的路。
问题来自于isnan
无法在字符串上调用的事实。因此,诀窍是迭代元素,对任何非类型字符串的元素执行isnan
操作。
[isnan(i) if type(i) != str else False for i in a]