簡體   English   中英

Python:從元組列表中創建圖像的快速方法

[英]Python: Fast way to create image from a list of tuples

我正在做以下事情。

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),....]

xiyi是整數

對於積分較少的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 ndarrays的情況下,它實際上是一個巨大的加速)

你為什么讀作元組的東西? 難道你不應該首先嘗試將其作為一個numpy ndarray讀取,而不是將其作為元組列表讀取而不是更改為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)

它將比任何循環解決方案快得多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM