2017-02-23 118 views
1

Начинающий в Python здесь, я с трудом обворачиваю голову вокруг векторизации своих циклов «для». У меня есть двумерный массив numpy, содержащий только два значения -1 и 1. Для каждого столбца и строки я хочу выполнить следующую операцию: установить все значения -1, встречающиеся до первого момента, когда 1 встречается в 0. Может ли это быть векторизован? Даже без сбоев, если в строке/столбце нет 1, и поэтому вся строка/столбец должна быть установлена ​​в 0?Можно ли векторизовать операцию этого массива в python?

+0

Можете ли вы дать некоторые входные и выходные выборки? – Eric

ответ

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