我有一个numpy数组,其中包含如下日期和时间
a[0]=2014-06-01 03:14:34
我检查a[0]的类型。numpy数组中的一些值是nan。我必须把nan换成0,剩下的换成1。我尝试了isnan(a),但它给了我错误:输入类型不支持TypeError: ufunc 'isnan',并且根据强制转换规则" safe "不能安全地将输入强制为任何支持的类型。哪里出了问题,我如何用0代替nan ?
为了让你的数组同时包含字符串和nan,它必须是对象dtype。对象类型为dtype的NumPy数组在内存或性能方面不是特别有效。对象数组没有向量化操作。错误信息
TypeError: ufunc 'isnan'不支持输入类型,并且根据强制转换规则" safe "不能安全地将输入强制为任何支持的类型
表示np.isnan
不能应用于对象数组,而这个对象数组不能被强制转换为支持的数据类型,如np.float
。
理想情况下,首先要避免构建对象数组。但是考虑到你有了这个对象数组,要构建新的数组,你不妨循环一下列表推导式中a
中的项:
import numpy as np
a = np.array(['2014-06-01 03:14:34', np.nan], dtype='O')
b = np.array([item == item for item in a]).astype(int)
print(b)
收益率[1 0]
item == item
如何测试NaN:
NaN具有NaN != NaN的属性。NaN是标准Python对象中唯一具有此属性的对象。可以定义自定义类,其实例也可以具有此属性。只要a
不包含这样一个自定义类的实例,您就可以使用item != item
属性来测试NaN:
In [43]: float('nan') != float('nan')
Out[43]: True
In [44]: np.nan != np.nan
Out[44]: True
在我的情况下,我必须使用np.zeros
创建预设大小的数组,然后手动填充单元格以创建我可以使用isnan
的矢量numpy数组。
在下面的代码中,fields
包含对象数组中使用的字段名列表。
v_data = np.zeros((o_data.shape[0], len(fields)))
for rcounter, row in enumerate(o_data):
for fcounter, field in enumerate(fields):
v_data[rcounter, fcounter] = row[field]
您可以使用function:
def replace_nan(num):
if not numpy.nan_to_num(num):
return 1