2012-02-29 2 views
4

Часто я использую функцию numpy.where для набора кортежей индексов матрицы, имеющей некоторое свойство. НапримерКак инвертировать функцию numpy.where (np.where)

import numpy as np 
X = np.random.rand(3,3) 
>>> X 
array([[ 0.51035326, 0.41536004, 0.37821622], 
    [ 0.32285063, 0.29847402, 0.82969935], 
    [ 0.74340225, 0.51553363, 0.22528989]]) 
>>> ix = np.where(X > 0.5) 
>>> ix 
(array([0, 1, 2, 2]), array([0, 2, 0, 1])) 

IX теперь кортеж ndarray объектов, которые содержат строки и столбцы индексы, в то время как подвыражении Х> 0,5 содержит одну булеву матрицу, указывающую, какие клетки имели> 0,5 свойства. Каждое представление имеет свои преимущества.

Каков наилучший способ взять объект ix и преобразовать его обратно в булевскую форму позже, когда это необходимо? Например,

G = np.zeros(X.shape,dtype=np.bool) 
>>> G[ix] = True 

Есть ли один вкладыш, который выполняет одно и то же?

ответ

3

Что-то вроде этого, может быть?

mask = np.zeros(X.shape, dtype='bool') 
mask[ix] = True 

но если это что-то простое, как X > 0, вы, вероятно, лучше делать mask = X > 0 если mask очень редки или вы больше не имеют ссылки на X.

0
mask = X > 0 
imask = np.logical_not(mask) 

Например

Edit: Извините за столь кратким раньше. Не следует отвечать на вопросы по телефону: P

Как я уже отмечал в примере, лучше просто инвертировать булевую маску. Гораздо эффективнее/проще, чем возврат от результата where.

1
>>> G = np.zeros(X.shape,dtype=np.bool) 
>>> G[ix] = True 

Ответ на вопрос по умолчанию (с точки зрения элегантности, эффективности).

0

Нижняя часть np.where docstring предлагает использовать для этого np.in1d.

>>> x = np.array([1, 3, 4, 1, 2, 7, 6]) 
>>> indices = np.where(x % 3 == 1)[0] 
>>> indices 
array([0, 2, 3, 5]) 
>>> np.in1d(np.arange(len(x)), indices) 
array([ True, False, True, True, False, True, False], dtype=bool) 

(Хотя это хороший один лайнер, это намного медленнее, чем решение @Bi Рико.)

Смежные вопросы