numpy.where () explicação detalhada / exemplos passo a passo / exemplos [fechado]

168

Tenho problemas para entender corretamente, numpy.where()apesar de ler o documento , esta postagem e esta outra postagem .

Alguém pode fornecer exemplos comentados passo a passo com matrizes 1D e 2D?

Alexandre Holden Daly
fonte

Respostas:

272

Depois de mexer um pouco, descobri as coisas e as estou postando aqui esperando que ajude os outros.

Intuitivamente, np.whereé como perguntar " diga-me onde, nessa matriz, as entradas atendem a uma determinada condição ".

>>> a = np.arange(5,10)
>>> np.where(a < 8)       # tell me where in a, entries are < 8
(array([0, 1, 2]),)       # answer: entries indexed by 0, 1, 2

Também pode ser usado para obter entradas na matriz que atendem à condição:

>>> a[np.where(a < 8)] 
array([5, 6, 7])          # selects from a entries 0, 1, 2

Quando aé uma matriz 2D, np.where()retorna uma matriz de linhas idx e uma matriz de colunas idx:

>>> a = np.arange(4,10).reshape(2,3)
array([[4, 5, 6],
       [7, 8, 9]])
>>> np.where(a > 8)
(array(1), array(2))

Como no caso 1d, podemos usar np.where()para obter entradas na matriz 2d que atendem à condição:

>>> a[np.where(a > 8)] # selects from a entries 0, 1, 2

matriz ([9])


Observe que, quando a1d, np.where()ainda retorna uma matriz de idx de linha e uma matriz de id de coluna, mas as colunas têm o comprimento 1, portanto, a última é uma matriz vazia.

Alexandre Holden Daly
fonte
10
Eu estava lutando para entender o np.where quando usado em 2d até encontrar sua resposta "Quando a é uma matriz 2d, np.where () retorna uma matriz de linhas idx e uma matriz de col idx:". Obrigado por isso.
Bencampbell_14
1
Eu estava me sentindo muito estúpido depois de ler o documento três vezes e ainda não resolver o quebra-cabeça np.where(2d_array), obrigado por esclarecer isso! Você deve aceitar sua própria resposta. e: Ah, está fechado. Bem, não deveria ser
smcs
5
É uma pena que isso tenha sido fechado. No entanto, gostaria de acrescentar outro recurso np.wherea essa resposta completa. A função também pode selecionar elementos das matrizes x e y, dependendo da condição. Espaço limitado neste comentário, mas veja: np.where(np.array([[False,False,True], [True,False,False]]), np.array([[8,2,6], [9,5,0]]), np.array([[4,8,7], [3,2,1]]))retornará array([[4, 8, 6], [9, 2, 1]]). Observe quais elementos de x e y se escolhidos dependendo Verdadeiro / Falso
piccolo
A explicação dada nesta resposta é apenas um caso especial de np.where. De acordo com a documentação, Quando somente conditioné fornecida, esta função é uma abreviação para np.asarray(condition).nonzero().
Lenny
19

Aqui está um pouco mais divertido. Descobri que, muitas vezes, o NumPy faz exatamente o que eu gostaria que ele fizesse - às vezes é mais rápido para mim tentar coisas do que ler os documentos. Na verdade, uma mistura de ambos é a melhor.

Acho que sua resposta é boa (e não há problema em aceitá-la, se quiser). Isso é apenas "extra".

import numpy as np

a = np.arange(4,10).reshape(2,3)

wh = np.where(a>7)
gt = a>7
x  = np.where(gt)

print "wh: ", wh
print "gt: ", gt
print "x:  ", x

dá:

wh:  (array([1, 1]), array([1, 2]))
gt:  [[False False False]
      [False  True  True]]
x:   (array([1, 1]), array([1, 2]))

... mas:

print "a[wh]: ", a[wh]
print "a[gt]  ", a[gt]
print "a[x]:  ", a[x]

dá:

a[wh]:  [8 9]
a[gt]   [8 9]
a[x]:   [8 9]
uhoh
fonte