我有一个多维的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.
如果可能的话,我想在没有循环的情况下这样做,因为我的代码不完整。
答案 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]]
换句话说,数组已经删除了所有带有屏蔽数据的列。希望这次我做对了。