繁体   English   中英

如何正确使用 np.isnan() 检测数组中的 nan 元素?

[英]how to properly use np.isnan() to detect nan elements in array?

我正在尝试使用sickit 中的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)

这里 p 是一个二维数组。所以如果我运行上面的代码,我会得到 -

我收到此运行时警告 -

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

所以这个问题出现是因为 np.mean 不能计算空切片的平均值,所以为了避免 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]]

上面奇怪的是,如果不是 nan,它只应该打印 C[i][0] 元素。 但是 np.isnan(C[i][0]) 返回 false 并且该值仍然是 nan 并且它被打印出来。 我的输入数据不包含任何 nan 值。我确信这一点。

请告诉我我错过了什么。如果我的问题的任何部分不清楚,请随时告诉我。

为了过滤掉nan值,这里有一个快速的解决方法:

import numpy as np
C = np.array([x for x in C if np.std(x) > 0])

我使用np.std是因为要使列表理解工作,我们需要使用一些返回标量值的函数,因此您可以使用任何函数,例如 mean、var 等。

希望能帮助到你。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM