我使用sklearn和有一个问题的亲和传播。我已经建立了一个输入矩阵,我一直得到以下错误。
ValueError: Input contains NaN, infinity or a value too large for dtype('float64').
我已经跑了
np.isnan(mat.any()) #and gets False
np.isfinite(mat.all()) #and gets True
我试着用
mat[np.isfinite(mat) == True] = 0
去除掉无限值,但这也没用。
我要怎么做才能去掉矩阵中的无穷大值,这样我就可以使用亲和传播算法了?
我使用anaconda和python 2.7.9。
在python 3的这个版本中:
/opt/anaconda3/bin/python --version
Python 3.6.0 :: Anaconda 4.3.0 (64-bit)
查看错误的详细信息,我发现导致失败的代码行:
/opt/anaconda3/lib/python3.6/site-packages/sklearn/utils/validation.py in _assert_all_finite(X)
56 and not np.isfinite(X).all()):
57 raise ValueError("Input contains NaN, infinity"
---> 58 " or a value too large for %r." % X.dtype)
59
60
ValueError: Input contains NaN, infinity or a value too large for dtype('float64').
由此,我能够提取正确的方法来测试我的数据所发生的事情,使用由错误消息给出的失败的相同测试:
然后,通过一个快速而肮脏的循环,我能够发现我的数据确实包含nan:
print(p[:,0].shape)
index = 0
for i in p[:,0]:
if not np.isfinite(i):
print(index, i)
index +=1
(367340,)
4454 nan
6940 nan
10868 nan
12753 nan
14855 nan
15678 nan
24954 nan
30251 nan
31108 nan
51455 nan
59055 nan
...
现在我要做的就是去掉这些下标处的值。