从另一个numpy数组中移除阵列中的nan

时间:2016-02-19 06:00:52

标签: python numpy

如果在其中任何一个中存在相同位置的nan,我想从两个数组中删除nans。阵列长度相同。这就是我在做的事情:

y = numpy.delete(y, numpy.where(numpy.isnan(x)))
numpy.delete(y, numpy.where(numpy.isnan(x)))

然而,这只有在x是具有nan的情况下才有效。如果xy具有nan?

,如何使其工作

2 个答案:

答案 0 :(得分:1)

import numpy as np
import numpy.ma as ma

y = ma.masked_array(y, mask=~np.isnan(x))
y = y.compress() # y without nan where x has nan's

或者,在评论之后:

mask = ~np.isnan(x) & ~np.isnan(y)
y = ma.masked_array(y, mask=mask)
y = y.compress() # y without nan where x and y have nan's

x = ma.masked_array(x, mask=mask)
x = x.compress() # x without nan where x and y have nan's

或没有面具:

mask = ~np.isnan(x) & ~np.isnan(y)
y = y[mask]
x = x[mask]

答案 1 :(得分:1)

您必须跟踪要从两个阵列中删除的索引。您不需要where,因为numpy支持布尔索引(掩码)。此外,您不需要delete,因为您可以获得数组的子集。

mask = ~np.isnan(x)
x = x[mask]
y = y[mask]
mask = ~np.isnan(y)
x = x[mask]
y = y[mask]

或更紧凑:

mask = ~np.isnan(x) & ~np.isnan(y)
x = x[mask]
y = y[mask]

如果数组很大,第一个实现只有一个优点,从较小的数组计算y的掩码具有性能优势。一般来说,我会推荐第二种方法。