Python-遍历矩阵的更有效方法

时间:2020-02-29 09:32:02

标签: python numpy loops matrix

我有

  • (高度x宽度x 3)RGB图片 img
  • (256 x 256 x 256)矩阵 color_mapping 映射颜色
  • (高度x宽度)矩阵 pixel_result ,我要用 color_mapping 映射的元素填充对于图像的每个像素

如何有效地填充最后一个矩阵?

到目前为止,我只是遍历了 for循环中的所有像素,但我想知道是否有更有效的方法

for i in range(width):
    for j in range(height):
        pixel_result[j,i] = color_mapping[img[j,i,0],img[j,i,1],img[j,i,2]]

1 个答案:

答案 0 :(得分:1)

您可以通过在color_mapping下标来实现:

pixel_result = color_mapping[img[:,:,0], img[:,:,1], img[:,:,2]]

例如,如果使用以下方法测试性能:

>>> def f():
...   for i in range(width):
...     for j in range(height):
...         pixel_result[j,i] = color_mapping[img[j,i,0],img[j,i,1],img[j,i,2]]
... 
>>> def g():
...     pixel_result = color_mapping[img[:,:,0], img[:,:,1], img[:,:,2]]
>>> color_mapping = np.random.randn(256,256,256)

然后显示一个小图像:img = np.random.randint(0, 256, (12, 7, 3)),我们得到:

>>> timeit(f, number=10000)
0.5247259399620816
>>> timeit(g, number=10000)
0.032307324931025505

对于较大的图像,例如img = np.random.randint(0, 256, (1920, 1080, 3)),我们得到:

>>> timeit(f, number=10)
18.934733690926805
>>> timeit(g, number=10)
0.5807857210747898

或对于72×128图像:

>>> timeit(f, number=100)
0.6014469779329374
>>> timeit(g, number=100)
0.011570235947147012