【问题标题】:Converting "nan" values to a different value different than 0 in a numpy matrix在numpy矩阵中将“nan”值转换为不同于0的不同值
【发布时间】:2016-05-11 02:07:12
【问题描述】:

我有这样一个 numpy 矩阵:

[[182 93 107 ..., nan nan -1]
 [182 93 107 ..., nan nan -1]
 [182 93 110 ..., nan nan -1]
 ..., 
 [188 95 112 ..., nan nan -1]
 [188 97 115 ..., nan nan -1]
 [188 95 112 ..., nan nan -1]]

我想将 nan 值更改为不同于零的值。出于这个原因,我使用了这种技术:

x_train[np.isnan(x_train)] = -10

但是我收到了这个错误:

TypeError: ufunc 'isnan' 不支持输入类型,并且 输入无法安全地强制转换为任何支持的类型 强制转换规则“安全”。

我该如何解决这个问题?

谢谢,

【问题讨论】:

  • 什么是x_train.dtype
  • x_train.dtype = object
  • 那么这就是你的问题——NumPy 不知道在你的对象数组中调用nan,就像它们都是浮点数一样。我们可能需要更多地了解您如何加载数据以及数据的外观。
  • 这不是问题@xnx,我可以将dtype更改为不同的类型,不用担心。如果我的 dtype 是字符串,你能告诉我解决方案吗?
  • 如果 dtype 是数字类型,例如 float64,您的代码应该可以正常工作。

标签: python numpy matrix nan


【解决方案1】:

您可以尝试使用数组迭代器,例如:

import numpy as np


a = np.empty((6,4))
a.fill(0.25)
a[2].fill(np.nan)      
for x in np.nditer(a, op_flags=['readwrite']):
    if np.isnan(x):
        x[...]=-10

【讨论】:

  • 这并不能解决问题。这只是做同样事情的一种较慢的方式。
【解决方案2】:

如果您的初始数组是可以有意义地解释为floats 的字符串,那么您可以使用astype 进行转换:

b = np.array([['182', '93', '107', 'nan', 'nan', '-1'],
 ['182', '93', '107', 'nan', 'nan', '-1'],
 ['182', '93', '110', 'nan', 'nan', '-1'],
 ['188', '95', '112', 'nan', 'nan', '-1'],
 ['188', '97', '115', 'nan', 'nan', '-1'],
 ['188', '95', '112', 'nan', 'nan', '-1']])

c = b.astype(np.float)
c[np.isnan(c)]=-10

array([[ 182.,   93.,  107.,  -10.,  -10.,   -1.],
       [ 182.,   93.,  107.,  -10.,  -10.,   -1.],
       [ 182.,   93.,  110.,  -10.,  -10.,   -1.],
       [ 188.,   95.,  112.,  -10.,  -10.,   -1.],
       [ 188.,   97.,  115.,  -10.,  -10.,   -1.],
       [ 188.,   95.,  112.,  -10.,  -10.,   -1.]])

【讨论】:

    【解决方案3】:

    你可以使用numpy的copyto函数:

    import numpy as np
    
    xtrain = np.array([[0.3, np.nan],[1.0, np.nan]])
    default = np.empty([2,2])
    default.fill(-10)
    print(xtrain)
    np.copyto(xtrain,default,'no',np.isnan(xtrain))
    print(xtrain)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-21
      • 2021-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-28
      • 2018-10-31
      相关资源
      最近更新 更多