numpy.where () spiegazione dettagliata dettagliata / esempi [chiuso]


168

Ho difficoltà a capire correttamente numpy.where()nonostante abbia letto il documento , questo post e questo altro post .

Qualcuno può fornire esempi commentati passo-passo con array 1D e 2D?

Risposte:


272

Dopo aver armeggiato per un po ', ho capito le cose e le sto postando qui sperando che possa aiutare gli altri.

Intuitivamente, np.whereè come chiedere " dimmi dove in questo array, le voci soddisfano una determinata condizione ".

>>> 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

Può anche essere utilizzato per ottenere voci nell'array che soddisfano la condizione:

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

Quando aè un array 2d, np.where()restituisce un array di idx di riga e un array di id di col:

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

Come nel caso 1d, possiamo usare np.where()per ottenere voci nell'array 2d che soddisfano la condizione:

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

array ([9])


Nota, quando aè 1d, np.where()restituisce comunque una matrice di idx di riga e una matrice di id di col, ma le colonne sono di lunghezza 1, quindi quest'ultima è una matrice vuota.


10
Stavo lottando per capire np.where quando usato su 2d fino a quando ho trovato la tua risposta "Quando a è un array 2d, np.where () restituisce un array di idx di riga e un array di idx di col:". Grazie per quello
bencampbell_14,

1
Mi sentivo piuttosto stupido dopo aver letto il documento tre volte e ancora non ho risolto il puzzle np.where(2d_array), grazie per averlo chiarito ! Dovresti accettare la tua risposta. e: Oh, è chiuso. Bene, non dovrebbe essere
smc

5
È un peccato che questo fosse chiuso. Tuttavia, vorrei aggiungere un'altra caratteristica np.wherea questa risposta altrimenti completa. La funzione può anche selezionare elementi dall'array xey in base alla condizione. Spazio limitato in questo commento ma vedi: 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]]))tornerà array([[4, 8, 6], [9, 2, 1]]). Nota quali elementi di xey vengono scelti in base a Vero / Falso
piccolo

La spiegazione fornita in questa risposta è solo un caso speciale di np.where. Secondo la documentazione, quando conditionviene fornita solo , questa funzione è una scorciatoia per np.asarray(condition).nonzero().
Lenny,

19

Qui è un po 'più divertente. Ho scoperto che molto spesso NumPy fa esattamente quello che vorrei che facesse - a volte è più veloce per me provare le cose piuttosto che leggere i documenti. In realtà una miscela di entrambi è la cosa migliore.

Penso che la tua risposta vada bene (ed è OK accettarla se vuoi). Questo è solo "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]))

... ma:

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]

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.