[英]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.