Как инвертировать функцию numpy.where (np.where) - PullRequest
5 голосов
/ 29 февраля 2012

Я часто использую функцию numpy.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, которые содержат индексы строк и столбцов, тогда как подвыражение X> 0.5 содержит единственную логическую матрицу, указывающую, какие ячейки имеют свойство> 0,5. Каждое представление имеет свои преимущества.

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

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

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

Ответы [ 4 ]

5 голосов
/ 29 февраля 2012

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

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

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

2 голосов
/ 01 марта 2012
mask = X > 0
imask = np.logical_not(mask)

Например

Редактировать: Извините за то, что я был таким кратким. Не должен отвечать на звонки по телефону: P

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

1 голос
/ 05 сентября 2014

В нижней части строки документации np.where предлагается использовать 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 Rico.)

1 голос
/ 01 марта 2012
>>> G = np.zeros(X.shape,dtype=np.bool)
>>> G[ix] = True

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

...