2017-02-07 3 views
2

У меня есть numpy array:Логическое массив не все истинные значения в одной строке

np.random.seed(100) 
mask = np.random.choice([True, False], size=(10,3)) 
print (mask) 
[[ True True False] 
[False False False] 
[ True True True] <- problem - all values True 
[ True True False] 
[ True True True] <- problem - all values True 
[ True False True] 
[ True False True] 
[False True True] 
[ True False False] 
[False True True]] 

Потребность в каждой строке не все значения не True - так что здесь может быть только 0, 1 или 2True потому 3 'columns'.

Гадкий решение:

mask[:, -1] = False 
print (mask) 
[[ True True False] 
[False False False] 
[ True True False] 
[ True True False] 
[ True True False] 
[ True False False] 
[ True False False] 
[False True False] 
[ True False False] 
[False True False]] 

Что лучше и более общее решение?

+2

'mask [mask.all (1), - 1] = 0'? Это создало бы другой, чем тот, который был отправлен с уродливым решением. – Divakar

+1

@ Divakar ваша короткая версия кода избили мой ответ на несколько секунд – EdChum

ответ

3

Вы можете сделать:

In [109]: 
mask[mask.all(axis=1),-1] = False 
mask 

Out[109]: 
array([[ True, True, False], 
     [False, False, False], 
     [ True, True, False], 
     [ True, True, False], 
     [ True, True, False], 
     [ True, False, True], 
     [ True, False, True], 
     [False, True, True], 
     [ True, False, False], 
     [False, True, True]], dtype=bool) 

Так что тест построчно с помощью all и установить только 3-й седловины к False при этом условии

Благодаря @Divakar, вы можете набрать меньше:

In [110]: 
mask[mask.all(1),2] = 0 
mask 

Out[110]: 
array([[ True, True, False], 
     [False, False, False], 
     [ True, True, False], 
     [ True, True, False], 
     [ True, True, False], 
     [ True, False, True], 
     [ True, False, True], 
     [False, True, True], 
     [ True, False, False], 
     [False, True, True]], dtype=bool) 

Таким образом, положение arg axis устанавливается и 0 ливается в boolean False в противном случае то же самое

Некоторое объяснение, сначала используйте all с axis=1, чтобы проверить строку, если все верно.

Затем мы используем эту маску, чтобы скрыть строки в квадратных скобках, то второй аргумент -1 выбирает последний столбец и, наконец, присвоить новое Желаемое значение

+2

Я бы посоветовал вам добавить, что более короткий, поскольку оба они в основном одинаковы, если вы хотите :) – Divakar

+1

как это работает? – dabadaba

+1

@Divakar обязательно сделает – EdChum

2

Вот изрядные один (все юридические тройни равновероятно):

N = 10 
bits = np.random.randint(7, size=(N,)) 
mask = (bits[:, None] & 2**np.arange(3)).astype(bool) 
Смежные вопросы