矢量化逻辑索引

Vectorize logical indexing

提问人:flawr 提问时间:11/3/2023 最后编辑:phoflawr 更新时间:11/3/2023 访问量:47

问:

我有一个有三个通道的图像。我还有一个掩码,可以从每个通道中随机提取相同数量的像素(但不一定在各个通道之间相同)。

是否可以对提取过程(即通道上的循环)进行矢量化?

这是我试图以非矢量化的方式做的事情:

到目前为止,我的直觉是,通过掩码是不可能的,因为先验地不清楚每个掩码是否具有相同数量的值。True

import numpy as np
np.random.seed(0)
# set up image
img = np.random.random((3, 100, 111))

# set up some mask with same number of "True" pixels per channel
p = 0.3
mask_array = np.stack([np.random.permutation(np.prod(img.shape[1:])).reshape(img.shape[1:]) > p for _ in range(img.shape[0])], axis=0)
print(mask_array.shape) # same as img.shape

# can we vectorize the loop over k away?
output = np.stack([img[k, mask_array[k, ...]] for k in range(img.shape[0])], axis=0)

print(output.shape)  # img.shape[0] x N
numpy 索引 矢量化

评论


答:

2赞 Nin17 11/3/2023 #1

将蒙版应用于图像将导致拼合数组。然后,您可以重新调整结果:

vector_output = img[mask_array].reshape((3, -1))

assert np.allclose(output, vector_output) # Assertion succeeds

评论

0赞 pho 11/3/2023
我的错!它隐藏在 .我正在看,没有意识到你这样做只是为了计算。对不起allcloseoutputallclose
0赞 Nin17 11/3/2023
但实际上,你的答案更好,其他的重塑是不必要的
1赞 pho 11/3/2023
由于它与您的基本相同,因此我编辑了您的答案:)
0赞 pho 11/3/2023
您可以考虑删除安装代码,因为它在功能上与 OP 相同。我编辑了这个问题以更改调用,因为这可能是 OP 的意图np.zeros()np.random.random
1赞 flawr 11/3/2023
这是一个聪明的主意,谢谢你们俩的精彩回答!