您可以删除
NaN
首先从数据中提取,然后绘制过滤后的数据。
要做到这一点,你可以先找到
楠
他在用什么
np.isnan(data)
,然后使用
~
operator
.用它来索引数据数组,然后过滤掉
楠
s
filtered_data = data[~np.isnan(data)]
在一个完整的例子中(改编自
here
)
对于1D数据:
import matplotlib.pyplot as plt
import numpy as np
# fake up some data
spread = np.random.rand(50) * 100
center = np.ones(25) * 50
flier_high = np.random.rand(10) * 100 + 100
flier_low = np.random.rand(10) * -100
data = np.concatenate((spread, center, flier_high, flier_low), 0)
# Add a NaN
data[40] = np.NaN
# Filter data using np.isnan
filtered_data = data[~np.isnan(data)]
# basic plot
plt.boxplot(filtered_data)
plt.show()
对于二维数据:
对于二维数据,不能简单地使用上面的掩码,因为这样数据数组的每一列都有不同的长度。相反,我们可以创建一个列表,列表中的每一项都是数据数组中每一列的过滤数据。
列表理解可以在一行中完成:
[d[m] for d, m in zip(data.T, mask.T)]
import matplotlib.pyplot as plt
import numpy as np
# fake up some data
spread = np.random.rand(50) * 100
center = np.ones(25) * 50
flier_high = np.random.rand(10) * 100 + 100
flier_low = np.random.rand(10) * -100
data = np.concatenate((spread, center, flier_high, flier_low), 0)
data = np.column_stack((data, data * 2., data + 20.))
# Add a NaN
data[30, 0] = np.NaN
data[20, 1] = np.NaN
# Filter data using np.isnan
mask = ~np.isnan(data)
filtered_data = [d[m] for d, m in zip(data.T, mask.T)]
# basic plot
plt.boxplot(filtered_data)
plt.show()
我将把它作为一个练习留给读者,让他们把它扩展到3个或更多维度,但你明白了。