Python 如何使用numpy使用索引向量设置0-1矩阵?

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:

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]])