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

2024-05-15 03:49:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在做以下事情。在

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)

在哪里

^{pr2}$

xiyi是整数

对于点数较少的tup来说,这很好。对于大量的点~10^6,这需要几个小时。在

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


Tags: inimportnumpyforasnpzeros事情
2条回答

使用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)

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

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

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

试着去做

^{pr2}$

因为这会覆盖相同的内存地址,而不是创建一个新的内存点来放入“旧值+1”(注意:在这种情况下,这可能只会导致边际加速,但是如果你用同样的方法a+=B而不是C=a+B,在a和B分别是大约1gb的numpy ndarray的情况下,这实际上是一个巨大的加速)

你为什么读元组?你不应该首先把它作为一个numpy数组读入,而不是作为元组列表读入,然后改为numpy数组吗?你在哪里创建元组的大列表?如果可以避免这种情况,那么最好是避免元组列表,而不是创建元组列表,然后再交换到numpy解决方案?在

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

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

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

所以在你的最终结果中,除了0和1之外还会存在其他值?或者你得到的数组中只有一和零?在

相关问题 更多 >

    热门问题