如何处理numpy中的nan值

时间:2019-12-18 13:22:37

标签: python numpy scikit-learn

我正在尝试使用病态的DBSCAN查找集群。这是代码-

db = DBSCAN(eps=.2, min_samples=5).fit(p)
     cluster_labels = db.labels_
     num_clusters = len(set(cluster_labels))
     clusters = pd.Series([p[cluster_labels == n] for n in range(num_clusters)])
     print(len(clusters))
     C = np.empty(shape=(len(clusters), 2), dtype=np.float16)
     for i in range(len(clusters)):
         C[i] = np.mean(clusters[i], axis=0)
     print(C)

我收到此运行时警告-

 C:\Users\USER\PycharmProjects\REALDEPTH\venv\lib\site-packages\numpy\core\fromnumeric.py:3257: 

RuntimeWarning: Mean of empty slice.
  out=out, **kwargs)

C:\Users\USER\PycharmProjects\REALDEPTH\venv\lib\site-packages\numpy\core\_methods.py:154: 

RuntimeWarning: invalid value encountered in true_divide
  ret, rcount, out=ret, casting='unsafe', subok=False)

4

[[-1.369   1.895 ]
 [ 0.2095  0.763 ]
 [-0.572   1.688 ]
 [    nan     nan]]

我应该使用-

来避免它吗
import warnings

warnings.simplefilter("ignore")

或者我有什么办法可以正确修复它?例如删除包含nan值的行。

编辑:到目前为止,似乎忽略NAN值并不会导致我尝试执行的操作以及尝试执行此操作的问题-

    print(len(clusters))
    C = np.empty(shape=(len(clusters), 2))
for i in range(len(clusters)):
    if not np.isnan(C[i][0]):
        print(np.isnan(C[i][0]))
        C[i] = np.mean(clusters[i], axis=0, dtype=np.float64)
        print(C[i][0])

print(C)

我得到此输出-

C:\Users\USER\PycharmProjects\REALDEPTH\venv\lib\site-packages\numpy\core\fromnumeric.py:3257: RuntimeWarning: Mean of empty slice.
  out=out, **kwargs)
C:\Users\USER\PycharmProjects\REALDEPTH\venv\lib\site-packages\numpy\core\_methods.py:154: RuntimeWarning: invalid value encountered in true_divide
  ret, rcount, out=ret, casting='unsafe', subok=False)
4
False
-1.4311423570879045
False
0.14525776544683858
False
-0.7161999985172942
False
nan
[[-1.43114236  1.9280001 ]
 [ 0.14525777  0.79508425]
 [-0.7162      1.73658117]
 [        nan         nan]]

我不明白,np.isnan(C [i] [0])返回的是false,但是值是NAN,我想念的是什么? 我的数据集p太大,无法在此处显示,但是没有NAN元素,也没有元素太接近零。

3 个答案:

答案 0 :(得分:0)

像这样将您的nan值转换为零:

data = data.replace(np.nan,0)

答案 1 :(得分:0)

这实际上取决于您的数据以及如何处理此问题。这是预期的吗?您应该估算值吗?如果要使用nan删除行,可以执行以下操作:

p[~np.isnan(p).any(axis=1)]

答案 2 :(得分:0)

阅读我们可以推断出问题的警告位于

  

np.mean(clusters [i],axis = 0)

由于您要获取数组仅用于 NAN元素的平均值(如果您具有一些数字,则不会出现此错误),因此会收到此警告。建议:您是否想在群集结果中看到这些NAN