Начинающий в Python здесь, я с трудом обворачиваю голову вокруг векторизации своих циклов «для». У меня есть двумерный массив numpy, содержащий только два значения -1 и 1. Для каждого столбца и строки я хочу выполнить следующую операцию: установить все значения -1, встречающиеся до первого момента, когда 1 встречается в 0. Может ли это быть векторизован? Даже без сбоев, если в строке/столбце нет 1, и поэтому вся строка/столбец должна быть установлена в 0?Можно ли векторизовать операцию этого массива в python?
1
A
ответ
3
Вот один Векторизованных подход -
mask = a==1
a[~np.maximum.accumulate(mask,axis=0)] = 0
a[~np.maximum.accumulate(mask,axis=1)] = 0
Пример запуска -
In [39]: a
Out[39]:
array([[ 1, -1, 1, -1, -1],
[ 1, 1, -1, 1, -1],
[-1, 1, -1, 1, -1],
[ 1, -1, -1, -1, -1]])
In [40]: mask = a==1
In [41]: a[~np.maximum.accumulate(mask,axis=0)] = 0
In [42]: a[~np.maximum.accumulate(mask,axis=1)] = 0
In [43]: a
Out[43]:
array([[ 1, 0, 1, 0, 0],
[ 1, 1, -1, 1, 0],
[ 0, 1, -1, 1, 0],
[ 1, -1, -1, -1, 0]])
+0
Очень приятное решение, спасибо большое! – Adrien
Можете ли вы дать некоторые входные и выходные выборки? – Eric