Как установить 0-1 матрицу, используя вектор индексов, используя numpy? - PullRequest
2 голосов
/ 31 октября 2019

Матрица 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]])

Мы установим значения в A, индекс которых равенв B к 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]])

Я не хочу использовать для цикла, как я могу сделать это с NumPy?

Ответы [ 2 ]

2 голосов
/ 01 ноября 2019

Мы можем индексировать, используя массивы. Для axis0 мы просто создаем диапазон для 0-len (B), чтобы покрыть каждую строку. Затем для оси 1 мы транспонируем 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]])
0 голосов
/ 01 ноября 2019
>>> 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]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...