用0替换nan错误:输入类型不支持nan



我有一个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

最新更新