从numpy数组中删除条目

时间:2015-02-17 14:37:49

标签: python numpy

我有一个多维的numpy数组,其形状为(4,2000)。数组中的每一列都是4D元素,其中前两个元素表示2D位置。

现在,我有一个与二进制图像形状相同的图像蒙版,告诉我哪些像素有效或无效。掩码中的条目0突出显示无效的像素。

现在,我想做的是根据此蒙版过滤我的第一个数组,即删除第一个数组中的位置元素对应于图像中的无效像素的条目。这可以通过查找掩码中的相应条目并标记要删除的对应于掩码中的0条目的列来完成。

所以,比如:

import numpy as np
# Let mask be a 2D array of 0 and 1s

array = np.random.rand(4, 2000)

for i in range(2000):
    current = array[:, i]
    if mask[current[0], current[1]] <= 0:
        # Somehow remove this entry from my array.

如果可能的话,我想在没有循环的情况下这样做,因为我的代码不完整。

2 个答案:

答案 0 :(得分:3)

您可以从array中选择x和y坐标,如下所示:

xarr, yarr = array[0, :], array[1, :]

然后形成一个布尔形状的数组(2000,),无论掩码是1,都是True:

idx = mask[xarr, yarr].astype(bool)

mask[xarr, yarr]正在使用所谓的"integer array indexing"。 这意味着ith的{​​{1}}元素等于idx

然后从mask[xarr[i], yarr[i]]

中选择这些列
array

result = array[:, idx]

答案 1 :(得分:0)

我不确定我是否正确地阅读了这个问题。我们再试一次!

您有一个包含2个维度的数组,并且您希望删除所有具有屏蔽数据的列。再次,如果我读错了,请道歉。

import numpy.ma as ma
a = ma.array((([[1,2,3,4,5],[6,7,8,9,10]]),mask=[[0,0,0,1,0],[0,0,1,0,0]])
a[:,-a.mask.any(0)] # this is where the action happens

a.mask.any(0)标识所有被屏蔽到布尔数组中的列。它被否定(' - '符号),因为我们想要反转,然后它使用该数组通过索引删除所有被屏蔽的值。

这给了我一个数组:

[[1 2 5],[6 7 10]]

换句话说,数组已经删除了所有带有屏蔽数据的列。希望这次我做对了。