2011-05-18 63 views
7

我使用genfromtxt基本上導入二維陣列上,其所有形式的文本文件中列出值(x和y會是整數):轉換點列表的numpy的二維數組

x1 y1 z1 
    x2 y2 z2 
    : : : 

我使用下面的for循環,但我很確定必須有一種方法來做到這一點。什麼是更有效的方式來做這種轉換?

raw = genfromtxt(file,skip_header = 6) 

xrange = (raw[:,0].min() , raw[:,0].max()) 
yrange = (raw[:,1].min() , raw[:,1].max()) 

Z = zeros((xrange[1] - xrange[0] +1 , yrange[1] - yrange[0] +1)) 

for row in raw: 
    Z[ row[0]-xrange[0] , row[1]-yrange[0] ] = row[2] 
+0

第一個問題應該是你爲什麼使用genfromtxt?輸入中是否缺少值?你真的想要這些計算的起點是一個蒙面數組嗎? – talonmies 2011-05-18 16:30:34

回答

3

你可以用下面的代碼替換for循環與numpy.searchsorted,這也將允許非等間距/浮點數據:

raw = genfromtxt(file,skip_header = 6) 

xvalues = numpy.sorted(set(raw[:,0])) 
xidx = numpy.searchsorted(xvalues, raw[:,0]) 

yvalues = numpy.sorted(set(raw[:,1])) 
yidx = numpy.searchsorted(yvalues, raw[:,1]) 

Z = numpy.zeros((len(xvalues), len(yvalues))) 
Z[xidx, yidx] = raw[:,2] 

否則,我會跟隨西蒙的回答。

+0

+1擊敗我!我正在打字...... – 2011-05-18 16:43:49

+0

這正是我所期待的。謝謝! – foglerit 2011-05-18 17:03:10

0

要從一個文件中導入一個矩陣,你可以分割這些行然後轉換爲int。

[[int(i) for i in j.split()] for j in open('myfile').readlines()] 

當然,我假設你的文件只包含矩陣。

最後,您可以將此二維數組轉換爲numpy。

+2

爲什麼這比numpy的更簡單的導入函數''genfromtxt''(或''loadtxt''會在這種情況下會有效)好? – joris 2011-05-18 16:14:31

0

你可以嘗試這樣的事:

>>> Z = zeros((3, 3)) 
>>> test = array([[0, 1, 2], [1, 1, 6], [2, 0, 4]]) 
>>> Z[test[:, 0:2].T.tolist()] 
array([ 0., 0., 0.]) 
>>> Z[test[:, 0:2].T.tolist()] = test[:, 2] 
>>> Z 
array([[ 0., 2., 0.], 
     [ 0., 6., 0.], 
     [ 4., 0., 0.]]) 

你的情況:

xidx = (raw[:,0]-xrange[0]).astype(int) 
yidx = (raw[:,1]-yrange[0]).astype(int) 

Z[xidx, yidx] = raw[:,2] 
0

你也可以去:

Z[(raw[:, 0:2] - minimum(raw[:, 0:2], axis=0)).T.tolist()] = raw[:, 2]