Python 如何正确使用np.isnan()来检测数组中的nan元素?
我正在尝试使用sickit中的DBSCAN查找集群-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
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
吗?