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

Python 如何正确使用np.isnan()来检测数组中的nan元素?,python,pandas,numpy,Python,Pandas,Numpy,我正在尝试使用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.empt

我正在尝试使用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是一个2d数组,如果我运行上面的代码-

我得到了这个运行时警告-

 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]]
上面奇怪的是,如果C[i][0]元素不是nan,它应该只打印它。但是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等


希望有帮助。

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

import numpy as np
C = np.array([x for x in C if np.std(x) > 0])
我使用了
np.std
,因为要使列表理解工作,我们需要使用一些返回标量值的函数,因此您可以使用任何函数,如mean、var等


希望有帮助。

你看过
np.nanmean
吗?你看过
np.nanmean
吗?