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

2024-05-08 04:42:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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中,最简单/简洁的方法是什么?你知道吗


Tags: 方法numpy元素矩阵valijnx3
3条回答

创建一个空数组并用索引值填充它

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方法很方便。如果x不完整,reshape建议将出现问题。你知道吗

一种方法是使用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,如果索引出现多次,它们的值将被求和。你知道吗

coldspeed的解决方案的帮助下,这应该会得到你想要的:

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

相关问题 更多 >