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

时间:2015-08-11 12:14:42

标签: python numpy

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

3 个答案:

答案 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]