我有一个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中执行此操作的最简单/最简洁的方法是什么?
答案 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)