2016-07-16 83 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