如何从NumPy数组中删除NaN值?
[1, 2, NaN, 4, NaN, 8] ⟶ [1, 2, 4, 8]
如何从NumPy数组中删除NaN值?
[1, 2, NaN, 4, NaN, 8] ⟶ [1, 2, 4, 8]
当前回答
如果它有帮助,对于简单的1d数组:
x = np.array([np.nan, 1, 2, 3, 4])
x[~np.isnan(x)]
>>> array([1., 2., 3., 4.])
但如果你希望扩展到矩阵并保留形状:
x = np.array([
[np.nan, np.nan],
[np.nan, 0],
[1, 2],
[3, 4]
])
x[~np.isnan(x).any(axis=1)]
>>> array([[1., 2.],
[3., 4.]])
我在处理pandas .shift()功能时遇到了这个问题,我想避免使用.apply(…,轴=1)由于其效率低下,不惜一切代价。
其他回答
对我来说,@jmetz的答案不工作,但是使用pandas isnull()做到了。
x = x[~pd.isnull(x)]
filter(lambda v: v==v, x)
既适用于列表和numpy数组 因为v !=v仅用于NaN
使用实例删除NumPy数组x中的NaN值。
x = x[~numpy.isnan(x)]
解释
内部函数numpy。isnan返回一个布尔/逻辑数组,当x不是数字时,该数组的值为True。因为我们想要相反的结果,所以我们使用非逻辑操作符~来获得一个数组,在x为有效数字的任何地方都是true。
最后,我们使用这个逻辑数组对原始数组x进行索引,以便只检索非nan值。
如果你使用numpy
# first get the indices where the values are finite
ii = np.isfinite(x)
# second get the values
x = x[ii]
试试这个:
import math
print [value for value in x if not math.isnan(value)]
要了解更多,请阅读列表推导式。