我收到以下错误:
TypeError: Not implemented for this type
来自代码:
import numpy
:
print(numpy.isnan([1.,2.,3.,'A']))
我想知道为什么它不会只是返回false?因为我只想检查数组是否有任何非数字值。谢谢!
答案 0 :(得分:2)
问题是numpy.isnan
函数只检测NaN
并且只接受浮点数(或更精确的浮点数组),字符“A'不是NaN
,它是一个字符,其类型为str
;如果你尝试numpy.isnan('A')
,你会得到同样的错误。您的代码仅适用于[1, 2, 3, numpy.nan]
类型的列表:
print(numpy.isnan([1., 2., 3., numpy.nan]))
>>>[False False False True]
如果仅检查numpy.nan
是您的目标,并且您希望获得单个布尔值以确定列表是否包含numpy.nan
,则可能需要使用此代码:
print(numpy.isnan([1., 2., 3., numpy.nan]).any())
>>>True
print(numpy.isnan([1., 2., 3., 4.]).any())
>>>False
现在回到你想要的(检测列表是否包含非数字值,如' A'),你可以这样做:
def contains_non_numeric(my_list):
for item in my_list:
if any([isinstance(item, float), isinstance(item, int), isinstance(item, complex)]):
#You can remove or add the types that you find to be acceptable in your list
continue
else:
return False
return True
尝试这一点,你会得到你想要的东西:
contains_non_numeric([1, 2, 3, 'A'])
>>>True
contains_non_numeric([1, 2, 3])
>>>False
答案 1 :(得分:1)
它抱怨它无法测试字符串:
In [167]: np.isnan([1,2,3,'A'])
...
TypeError: Not implemented for this type
In [168]: np.isnan('A')
...
TypeError: Not implemented for this type
isnan
不是非数字类型的测试。
isnan(x [,out]): 为NaN测试元素,并将结果作为布尔数组返回。
由于您正在测试列表(而不是数组),我建议:
In [172]: try: [float(i) for i in [1.,2.,3.,'A']]
.....: except ValueError:
.....: print('has a nonnumeric element')
.....:
has a nonnumeric element
注意我们尝试将列表转换为数组时得到的结果:
In [173]: np.array([1.,2.,3.,'A'])
Out[173]:
array(['1.0', '2.0', '3.0', 'A'],
dtype='<U3')
字符串数组。