我在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]]]]
只。此外,删除行的相应标签也将被删除。
答案 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])
重建它。