Numpy - 从位置和值的矩阵构造矩阵

时间:2018-05-18 15:33:49

标签: python numpy

我有一个Nx3矩阵构造为,

i   j  val
.   .   .
.   .   .
.   .   .

我想构建一个矩阵,其中元素x_ij = val。例如位置值矩阵

[[ 0 0 3 ] 
 [ 1 1 2 ] 
 [ 0 1 4 ]
 [ 1 0 1 ]
 [ 2 0 5 ]
 [ 2 1 2 ]]

会产生矩阵,

[[3 4]
 [1 2]
 [5 2]]   

在numpy中执行此操作的最简单/最简洁的方法是什么?

3 个答案:

答案 0 :(得分:2)

制作一个空白数组,并用索引值

填充它
In [541]: x = np.array([[0, 0, 3],
     ...:                      [1, 1, 2],
     ...:                      [0, 1, 4],
     ...:                      [1, 0, 1],
     ...:                      [2, 0, 5],
     ...:                      [2, 1, 2]])
     ...:                      
In [543]: arr = np.zeros((3,2),int)
In [544]: arr[x[:,0], x[:,1]] = x[:,2]
In [545]: arr
Out[545]: 
array([[3, 4],
       [1, 2],
       [5, 2]])

在这种情况下,arr的所有元素都已定义,但即使有些元素保留为0,这也有效。如果存在重复项,并且您想对它们求和,那么coo方法很方便。如果reshape未完成,x建议会出现问题。

答案 1 :(得分:0)

一种方法是使用coo_matrix

>>> data = np.array([[0, 0, 3],
                     [1, 1, 2],
                     [0, 1, 4],
                     [1, 0, 1],
                     [2, 0, 5],
                     [2, 1, 2]])

>>> 
>>> from scipy import sparse
>>> i, j, v = data.T
>>> sparse.coo_matrix((v, (i, j)), (3, 2)).A
array([[3, 4],
       [1, 2],
       [5, 2]])

请注意,这会在缺少的位置创建0,如果索引多次显示,则会将其值相加。

答案 2 :(得分:0)

coldspeed的解决方案的帮助下,这应该可以帮助您获得所需的内容:

x[np.lexsort(np.fliplr(x).T)][:, -1].reshape(-1, x.shape[1] - 1)