代码之家  ›  专栏  ›  技术社区  ›  dspeyer

将映射数组应用于numpy数组中所有元素的快速方法?

  •  1
  • dspeyer  · 技术社区  · 7 年前

    现在,我得到的代码基本上是这样的:

    for x in range(img.shape[0]):
        for y in range(image.shape[1]):
            output[x,y] = map[ input[x,y] ]
    

    在哪里? output , input map 都是numpy数组(map大小为256,都是uint8类型)。

    这是可行的,但很慢。像这样的循环应该在C中,这就是numpy的目的。

    是否有一个numpy函数(或者cv2函数,反正我已经导入了它)可以做到这一点?

    2 回复  |  直到 7 年前
        1
  •  3
  •   Eelco Hoogendoorn    7 年前

    怎么样?

    output = map[input]
    
        2
  •  0
  •   arra    7 年前

    你在找 np.take 这很简单 map.take(input) . 这和Eelco的解决方案都比你的快得多;这比Eelco的系统快大约70%,尽管你的里程可能有所不同,而且 input.shape >> (1e4, 1e4) 你需要更好的解决方案。

    一个开始的地方是[各种numpy花式索引方法的性能,也包括numba],( Performance of various numpy fancy indexing methods, also with numba )其中详细说明了这个一般问题的各种与性能相关的事实( 我们怎么用呢 K -用于索引其他部分的维度数组 n -维度数组不仅仅是简单的方法)。

    如果你有类似的东西 Anaconda 已安装,您可以尝试使用 Numba jit np.ndarray.take(...) 看看你能买多少性能。上面的链接也解释了这一点。