2016-07-16 80 views
2

我在(x,y,value)三元組形式下的數據庫中有很多數據。
我希望能夠通過在數組的coords (x,y)上設置value來從這個數據動態創建一個2d numpy數組。Python:使用三元組數據填充Numpy 2D Array

舉例來說,如果我有:

(0,0,8) 
(0,1,5) 
(0,2,3) 
(1,0,4) 
(1,1,0) 
(1,2,0) 
(2,0,1) 
(2,1,2) 
(2,2,5) 

結果數組應該是:

Array([[8,5,3],[4,0,0],[1,2,5]]) 

我是新來numpy的,有沒有在numpy的任何方法來做到這一點?如果沒有,你會建議如何做?

+0

另外,請解釋如何得到結果數組? – Divakar

+0

....這就是我要求的.... – ibi0tux

+0

問題是模棱兩可的...我的信息缺失。你ñ例如,你正在創建一個9x3的3x3陣列...它似乎你只想要最後一列..但爲什麼要一個3x3陣列? –

回答

3

擴展來自@MaxU的回答,如果座標爲並不在網格的方式排列(或在某些情況下,座標缺失),可以按如下方式創建數組:

import numpy as np 

a = np.array([(0,0,8),(0,1,5),(0,2,3), 
       (1,0,4),(1,1,0),(1,2,0), 
       (2,0,1),(2,1,2),(2,2,5)]) 

這裏a代表你的座標。它是一個(N, 3)數組,其中N是座標的數量(它不必包含所有座標)。第一列aa[:, 0])包含Y位置,而第二柱(a[:, 1])包含X位置。同樣,最後一列(a[:, 2])包含您的

然後你就可以提取你的目標陣列的最大尺寸:

# Maximum Y and X coordinates 
ymax = a[:, 0].max() 
xmax = a[:, 1].max() 

# Target array 
target = np.zeros((ymax+1, xmax+1), a.dtype) 

最後,從你的座標數據填充到數組:

target[a[:, 0], a[:, 1]] = a[:, 2] 

以上組值target在行(所有Y)和a[:, 1](所有X)位置到其對應的a[:, 2]值(您的)。

>>> target 
array([[8, 5, 3], 
     [4, 0, 0], 
     [1, 2, 5]]) 

此外,如果您有缺少的座標,並且要通過一些數字來替換那些缺失值,可以初始化數組:

default_value = -1 
target = np.full((ymax+1, xmax+1), default_value, a.type) 

這樣,座標不目前列表中將填充目標數組中的-1/

+0

完美,謝謝!我明顯錯過了numpy('target [a [:,0],a [:, 1]] = a [:,2]')。 – ibi0tux

+1

@ ibi0tux很高興幫助!這是一個矢量化的任務。它基本上等於:for(y,x,val)in:target [y,x] = val'。但用vectorized操作替換for循環(在numpy中快得多)。 –

2

是你想要的嗎?

In [37]: a = np.array([(0,0,8) 
    ....:    ,(0,1,5) 
    ....:    ,(0,2,3) 
    ....:    ,(1,0,4) 
    ....:    ,(1,1,0) 
    ....:    ,(1,2,0) 
    ....:    ,(2,0,1) 
    ....:    ,(2,1,2) 
    ....:    ,(2,2,5)]) 

In [38]: 

In [38]: a 
Out[38]: 
array([[0, 0, 8], 
     [0, 1, 5], 
     [0, 2, 3], 
     [1, 0, 4], 
     [1, 1, 0], 
     [1, 2, 0], 
     [2, 0, 1], 
     [2, 1, 2], 
     [2, 2, 5]]) 

In [39]: 

In [39]: a[:, 2].reshape(3,len(a)//3) 
Out[39]: 
array([[8, 5, 3], 
     [4, 0, 0], 
     [1, 2, 5]]) 

或更靈活一點(後您的comment):

In [48]: a[:, 2].reshape([int(len(a) ** .5)] * 2) 
Out[48]: 
array([[8, 5, 3], 
     [4, 0, 0], 
     [1, 2, 5]]) 

說明:

這給你的第3列(值):

In [42]: a[:, 2] 
Out[42]: array([8, 5, 3, 4, 0, 0, 1, 2, 5]) 


In [49]: [int(len(a) ** .5)] 
Out[49]: [3] 

In [50]: [int(len(a) ** .5)] * 2 
Out[50]: [3, 3] 
+0

這聽起來很棒。你能解釋一下爲什麼你在做'a [:,2]'? – ibi0tux