Python:使用来自三元组的数据填充Numpy 2D数组

时间:2016-07-16 07:52:26

标签: python arrays python-3.x numpy

我在(x,y,value)三元组形式的数据库中有很多数据 我希望能够通过在数组的value处设置(x,y)来动态地从这些数据创建一个2d numpy数组。

例如,如果我有:

(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这样做?如果没有,你会建议采取什么方法?

3 个答案:

答案 0 :(得分: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 a[:, 0](所有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)

这样,列表中不存在的坐标将在目标数组/ {/ p>中填充-1

答案 1 :(得分: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]

答案 2 :(得分:2)

为什么不使用稀疏矩阵? (这几乎就是你的三胞胎的格式。)

首先使用numpy.hsplit()在行,列和数据中拆分三元组。 (使用numpy.squeeze()将生成的2d数组转换为1d数组。)

>>> row, col, data = [np.squeeze(splt) for splt
...                   in np.hsplit(tripets, tripets.shape[-1])]

以坐标格式使用稀疏矩阵,并将其转换为数组。

>>> from scipy.sparse import coo_matrix
>>> coo_matrix((data, (row, col))).toarray()
array([[8, 5, 3],
       [4, 0, 0],
       [1, 2, 5]])