我有一个numpy数组,其中包含日期和时间,如下所示
class DevicesController
before_action :found_device, only: :blacklist # get `@device`
before_action :blacklist_device, only: :blacklist
def blacklist
render :device, status: 200
end
private
def blacklist_device
if (params[:device]['blacklisted'] and
params[:device]['blacklisted'] == true and
@blacklist = BlacklistedDevice.create(device_id: @device.id, organisation_id: current_store.organisation.id))
@device.reload
else
render json: { error: "Missing or incorrect 'blacklisted' parameter" }, status: :unprocessable_entity
end
end
end
我检查了[0]的类型。它被赋予str。在numpy数组中的一些值是nan。我必须用0代替nan并用1代替。我试过isnan(a)但它给了我错误: TypeError:输入类型不支持ufunc'isnan',根据强制转换规则''safe',输入无法安全地强制转换为任何支持的类型 有什么问题,如何用0代替nan?
答案 0 :(得分:8)
为了使数组包含字符串和NaN,它必须是对象dtype。对象dtype的NumPy数组在内存或性能方面不是特别有效。 对象数组没有矢量化操作。错误消息
TypeError:ufunc' isnan'不支持输入类型,并且根据投射规则无法安全地将输入强制转换为任何支持的类型'''
表示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有the property that 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
答案 1 :(得分:0)
您可以使用功能:
def replace_nan(num):
if not numpy.nan_to_num(num):
return 1
答案 2 :(得分:0)
在我的情况下,我必须使用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]