Python:从元组列表创建图像的快速方法

Python:从元组列表创建图像的快速方法,python,numpy,scipy,Python,Numpy,Scipy,我正在做以下工作 import numpy as np import pylab ..... x = np.zeros([250,200]) for tup in tups: x[tup[1],tup[0]] = x[tup[1],tup[0]] + 1 pylab.imshow(x) 在哪里 tups = [(x1,y1),(x2,y2),....] 和xi,yi是整数 这对于点数较低的tup很好。对于大量分数~10^6,需要花费数小时 你能想出一个更快的方法吗?我很容易看到的

我正在做以下工作

import numpy as np
import pylab

.....

x = np.zeros([250,200])
for tup in tups:
    x[tup[1],tup[0]] = x[tup[1],tup[0]] + 1
pylab.imshow(x)
在哪里

tups = [(x1,y1),(x2,y2),....]
xi
yi
是整数


这对于点数较低的
tup
很好。对于大量分数~10^6,需要花费数小时


你能想出一个更快的方法吗?

我很容易看到的一个小改进,而不是下一个:

for tup in tups:
    x[tup[1],tup[0]] = x[tup[1],tup[0]] + 1
试着做

for tup in tups:
    x[tup[1],tup[0]] += 1
因为这会覆盖相同的内存地址,而不是创建一个新的内存点来放置“旧值+1”(注意:在这种情况下,这可能只会导致边际加速,但如果您使用相同的技巧a+=B而不是C=a+B,在a和B都是Gb的numpy n数组的情况下,实际上是一个巨大的加速)

你为什么把某些东西读入元组?您是否应该首先尝试将其作为numpy数组读入,而不是将其作为元组列表读入,然后更改为numpy数组?你在哪里创建这么大的元组列表?如果可以避免这种情况,那就更好了,只需避免元组列表,而不是创建元组列表,然后再切换到numpy解决方案

编辑:所以我只想告诉你这个加速,你可以通过+=,同时问为什么你有一个大的元组列表,但这太长了,不能把这两个东西都放在评论中

另一个问题:我假设元组可以有多个重复,对吗?像

tups = [(1,0), (2,4), (1,0), (1,2), ..., (999, 999), (992, 999)]

这样,在最终结果中,除了0和1之外,还会存在其他值吗?或者生成的数组中只存在1和0吗?

使用numpy,您可以将索引对转换为平面索引并对其进行bincount:

import numpy as np
import random

rows, cols = 250, 200
n = 1000

tups = [(random.randint(0, rows-1),
         random.randint(0, cols-1)) for _ in range(n)]

x = np.zeros((rows, cols))
for tup in tups:
    x[tup[0],tup[1]] += 1

flat_idx = np.ravel_multi_index(zip(*tups), (rows, cols))
y = np.bincount(flat_idx, minlength=rows*cols).reshape(rows, cols)

np.testing.assert_equal(x, y)

它将比任何循环解决方案快得多。

“对于大量点~10^6…”——你是说对于1000*1000的图片?它真的需要几个小时吗?不,我的意思是对于一个有10^6或更高元组的元组。我想我可能还有另一个问题使它变慢了。@medPhys pl这个问题可能会有所帮助:这个问题似乎离题了,因为它更适合@medPhys pl。不过,如果不首先列出元组列表,速度会快得多,因此,如果您显示在哪里制作元组列表,也可以在那里进行改进(如果直接将其放入numpy数组,而不是先使用元组列表,然后再转到numpy数组)我已经处理了元组并坚持使用numpy数组。虽然速度不快。我将实现Jaime的建议并compare@medPhys-pl但是你是如何制作numpy数组的,这是你很慢的地方,当你制作一个列表,然后向其中添加1e6元组时,我认为这也是一个速度瓶颈,(底线:当您不再使用元组列表时,如何制作numpy数组?您的输入看起来是什么样子的)