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



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

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

其中outputinputmap都是numpy数组(映射大小为256,都是uint8类型(。

这很有效,但速度很慢。像这样的循环应该在C中。这就是numpy的含义。

有没有一个numpy函数(或者cv2函数,我已经在导入了(可以做到这一点?

怎么样?

output = map[input]

您正在寻找与map.take(input)一样简单的np.take。这两个和Eelco的解决方案都比您的快得多;这比Eelco的系统快70%左右,尽管你的里程可能会有所不同,对于input.shape >> (1e4, 1e4),你需要一个更好的解决方案。

一个起点是[各种numpy花式索引方法的性能,也有numba](各种numpy花样索引方法的绩效,也有numba(,它详细介绍了这个通用问题的各种性能相关事实(,即我们如何使用一个k维数组来索引其他n维度数组,而不仅仅是琐碎的方式(。

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

最新更新