【问题标题】:StandardScaler -ValueError: Input contains NaN, infinity or a value too large for dtype('float64')StandardScaler -ValueError:输入包含 NaN、无穷大或对于 dtype('float64')来说太大的值
【发布时间】:2016-07-31 15:49:03
【问题描述】:

我有以下代码

X = df_X.as_matrix(header[1:col_num])
scaler = preprocessing.StandardScaler().fit(X)
X_nor = scaler.transform(X) 

并得到以下错误:

  File "/Users/edamame/Library/python_virenv/lib/python2.7/site-packages/sklearn/utils/validation.py", line 54, in _assert_all_finite
    " or a value too large for %r." % X.dtype)
ValueError: Input contains NaN, infinity or a value too large for dtype('float64').

我用过:

print(np.isinf(X))
print(np.isnan(X))

这给了我下面的输出。这并不能真正告诉我哪个元素有问题,因为我有数百万行。

[[False False False ..., False False False]
 [False False False ..., False False False]
 [False False False ..., False False False]
 ..., 
 [False False False ..., False False False]
 [False False False ..., False False False]
 [False False False ..., False False False]]

有没有办法确定矩阵 X 中的哪个值实际上导致了问题?人们一般如何避免它?

【问题讨论】:

    标签: python nan


    【解决方案1】:

    numpy 包含针对此类事物的各种逻辑元素测试。

    在您的特定情况下,您需要使用isinfisnan

    响应您的编辑:

    您可以将 np.isinf() 或 np.isnan() 的结果传递给 np.where(),这将返回条件为真的索引。这是一个简单的例子:

    import numpy as np
    
    test = np.array([0.1, 0.3, float("Inf"), 0.2])
    
    bad_indices = np.where(np.isinf(test))
    
    print(bad_indices)
    

    然后您可以使用这些索引来替换数组的内容:

    test[bad_indices] = -1

    【讨论】:

    • 谢谢。请看我上面修改过的问题,我需要从数百万条记录中找出具体的坏值……有什么好的方法吗?
    • 我实际上得到了: ('bad_indices ', (array([], dtype=int64), array([], dtype=int64))) 从 print('bad_indices ', np.where( np.isinf(X))) ... 没有返回任何索引 ...
    • 它返回了一个空的索引数组,这意味着数组中没有无限的值。改用 isnan() - 错误消息表明它可能是其中之一。
    • 用 np.isnan() 找到它。谢谢!
    猜你喜欢
    • 2017-11-23
    • 2020-08-16
    • 2020-05-25
    • 2019-02-17
    • 2020-10-23
    • 1970-01-01
    • 2023-01-11
    • 2019-08-25
    • 2017-02-19
    相关资源
    最近更新 更多