Скажем, 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]