Заменить значения индикатора фактическими значениями - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть такой пустой массив

array([[0, 0, 1],
       [1, 0, 0],
       [0, 1, 0],
       [0, 0, 1]])

и массив со значениями

array([1, 2, 3, 4])

Я хотел бы заменить единицы в первом двумерном массиве соответствующимизначения во втором массиве. Каждая строка первого массива имеет ровно одну 1, а во втором массиве есть только одна замена.

Результат:

array([[0, 0, 1],
       [2, 0, 0],
       [0, 3, 0],
       [0, 0, 4]])

Я бы хотел элегантного решения для достижения этой цели, безпетли и прочее.

1 Ответ

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

Скажем, a - это массив 2D-данных, а b - второй массив 1D.

. Элегантное решение -

a[a==1] = b

Для повышения производительности, используя тот факт, чтоесть ровно один 1 на строку, мы также можем использовать indexing -

a[np.arange(len(a)),a.argmax(1)] = b

Выборочно назначать на строку

Если мы хотим выборочнозначения маски и назначения в строке, мы могли бы использовать еще один уровень маскировки. Итак, допустим, у нас есть строки, которые нужно выбрать как -

select_rows = np.array([1,3])

Тогда мы можем сделать -

rowmask = np.isin(np.arange(len(a)),select_rows)

Итак, замена для первого подхода будет -

a[(a==1) & rowmask[:,None]] = b[rowmask]

А для второго -

a[np.arange(len(a))[rowmask],a.argmax(1)[rowmask]] = b[rowmask]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...