Python 如何使用numpy使用索引向量设置0-1矩阵?
矩阵A:Python 如何使用numpy使用索引向量设置0-1矩阵?,python,numpy,Python,Numpy,矩阵A: A = np.array([[3, 0, 0, 8, 3], [9, 3, 2, 2, 6], [5, 5, 4, 2, 8], [3, 8, 7, 1, 2], [3, 9, 1, 5, 5]]) 矩阵B:每行中的值表示矩阵A中每行的索引 B = np.array([[1, 2], [3, 4], [1, 3], [0, 1], [2, 3]]) 我们将把索引为B的A中的值设置为1,
A = np.array([[3, 0, 0, 8, 3],
[9, 3, 2, 2, 6],
[5, 5, 4, 2, 8],
[3, 8, 7, 1, 2],
[3, 9, 1, 5, 5]])
矩阵B:每行中的值表示矩阵A中每行的索引
B = np.array([[1, 2],
[3, 4],
[1, 3],
[0, 1],
[2, 3]])
我们将把索引为B的A中的值设置为1,其他值设置为0。
那么结果将是:
A = np.array([[0, 1, 1, 0, 0],
[0, 0, 0, 1, 1],
[0, 1, 0, 1, 0],
[1, 1, 0, 0, 0],
[0, 0, 1, 1, 0]])
我不想使用for循环,如何使用numpy实现它
>>> B = np.array([[1, 2],
... [3, 4],
... [1, 3],
... [0, 1],
... [2, 3]])
方便但有点浪费
>>> np.identity(5,int)[B].sum(1)
array([[0, 1, 1, 0, 0],
[0, 0, 0, 1, 1],
[0, 1, 0, 1, 0],
[1, 1, 0, 0, 0],
[0, 0, 1, 1, 0]])
更经济,但也更打字
>>> out = np.zeros((5,5),int)
>>> out[np.c_[:5],B] = 1
>>> out
array([[0, 1, 1, 0, 0],
[0, 0, 0, 1, 1],
[0, 1, 0, 1, 0],
[1, 1, 0, 0, 0],
[0, 0, 1, 1, 0]])
我们可以使用数组进行索引。对于axis0,我们只为0-len(B)设置一个覆盖每行的范围。然后对于axis1,我们转置B来表示我们想要访问的所有列索引
>>> C = np.zeros_like(A)
>>> C[np.arange(len(B)), B.T] = 1
>>> C
array([[0, 1, 1, 0, 0],
[0, 0, 0, 1, 1],
[0, 1, 0, 1, 0],
[1, 1, 0, 0, 0],
[0, 0, 1, 1, 0]])