在多维numpy数组中删除包含Nan值的整行

时间:2017-03-14 21:43:24

标签: python numpy

我在python中有两个numpy数组,features数组(4D)和标签数组(1D).Feature数组包含Nan值。我想删除包含Nan值(在features数组中)及其相应标签的整个行。 X是特征数组,Y是标签数组。 我在python中使用isnan函数

x=x[~np.any(np.isnan(x), axis=3)]

当我把轴= 1时,我得到一个错误

IndexError: index 5 is out of bounds for axis 1 with size 5

当我在代码中显示3时,代码运行没有错误,当我检查输出数组时,它不再具有Nan值,但是数组的前三个维度被折叠,导致2D阵列。 任何帮助将不胜感激。 让我们说这一行:

[[[[  1.70204959   1.52199801   1.90457233 ...,   1.93644699   1.88296615
  2.19928936],[1.52334234 1.338273......Nan 2.23324432]]]].

如果行包含非值,则应删除整行(不仅仅是Nan值),因此,对于此示例,我们应该保留:

[[[[  1.70204959   1.52199801   1.90457233 ...,   1.93644699   1.88296615
  2.19928936]]]] 

只。此外,删除行的相应标签也将被删除。

2 个答案:

答案 0 :(得分:0)

如果我理解正确,那么你想要达到的目标 - 遗憾的是 - 一般来说都不可能。

假设你有一个10x10x10的立方体,想要删除3行,每行10个元素。这将留下97行,由于97是素数,现在有办法,但将非行维度展平为一行。

由于很明显这种事情可能发生在4d或更高的维度,这或多或少都会发生。

作为一般规则,只有在掩码为1d时才能保留ndim,即如果要删除ndim-1大小的子空间。

features = np.random.random((10,9,8,7))
features[features<0.002] = np.nan
mask = np.any(np.isnan(features), axis = (0,2,3))
features[:, ~mask, ...].shape
# (10, 4, 8, 7)

正如您所看到的,为了保持4个dims,您必须沿 3 轴减少。 (0,2,3)在这个例子中。此列表中未出现的轴 - 在这种情况下为(1) - 将缩短。

您可以选择将哪一个轴作为缩短的轴,只需使用所有剩余的轴调用any来创建适当的蒙版。

答案 1 :(得分:0)

我了解x.shape(1,1,m,n)。使用valid=~any(np.isnan(x),3)

的方法可以做到这一点
x[:,:,valid.squeeze()]

保留4D或

x[valid].reshape(1,1,-1,x.shape[3])

重建它。