2014-01-30 92 views
0

我在做以下事情。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) 

tups = [(x1,y1),(x2,y2),....] 

xiyi是整數

這是罰款tup具有低數量的點。對於大量的點〜10^6,它需要數小時。

你能想到一個更快的方法嗎?

+0

「對於大量的點~10^6 ...」 - 你的意思是1000 * 1000的圖片?它真的需要幾個小時嗎? – zhangxaochen

+0

不,我的意思是有10^6或更高元組的tups。我想我可能會遇到另一個讓它放慢速度的問題。 –

+0

@ medPhys-pl這可能會有所幫助:[增加Numpy多重數組與重複索引](http://stackoverflow.com/questions/7433142/increment-numpy-multi-d-array-with-repeated-indices) –

回答

1

一個小的改善,我可以很容易地看到,而不是下一個,:

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 

因爲這將覆蓋相同的內存ADRESS,而不是創建一個新的內存現貨(注意:在這種情況下,這可能只會導致邊際加速,但如果您使用相同的技巧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)] 

因此,在您的endresult,其他值比0和1將存在?或者是你的結果數組只存在一個和零的數組?

+0

是的,你對重複是正確的。 –

+0

@ medPhys-pl如果你不首先創建一個元組列表,那麼它會快得多,所以如果你顯示你創建元組列表的位置,那麼它也可以在那裏得到改進(如果直接創建成一個numpy數組,而不是先使用元組列表,然後去一個numpy數組) – usethedeathstar

+0

我已經處理了元組,並且用一個numpy數組卡住了。雖然速度並不快。我會實施Jaime的建議,並比較 –

1

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

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