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

时间:2018-11-29 19:56:37

标签: python performance numpy

现在,我的代码基本上看起来像:

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

其中outputinputmap都是numpy数组(map的大小为256,均为uint8类型)。

这有效,但是很慢。这样的循环应该在C中。这就是numpy的作用。

是否有一个numpy函数(或cv2函数,无论如何我已经在导入该函数)?

2 个答案:

答案 0 :(得分:3)

怎么样?

output = map[input]

答案 1 :(得分:0)

您正在寻找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之类的东西,则可以尝试使用Numbajit np.ndarray.take(...)来查看可以购买多少性能。上面的链接也对此进行了说明。