impressionante spiegazione di ubuntu Dato, è possibile utilizzare reduce
per risolvere il problema, ma bisogna applicarlo a bitwise_and
e bitwise_or
piuttosto che equal
. Di conseguenza, questo non funzionerà con matrici in virgola mobile:
In [60]: np.bitwise_and.reduce(a) == a[0]
Out[60]: array([ True, False, True], dtype=bool)
In [61]: np.bitwise_and.reduce(b) == b[0]
Out[61]: array([ True, False, True], dtype=bool)
Fondamentalmente, si confrontano i bit di ciascun elemento della colonna. I bit identici sono invariati. Bit diversi sono impostati su zero. In questo modo, qualsiasi numero che abbia uno zero invece di un bit cambierà il valore ridotto. bitwise_and
non intercetterà il caso in cui vengono introdotti i bit anziché rimossi:
In [62]: c = np.array([[1,0,0],[1,0,0],[1,0,0],[1,1,0]])
In [63]: c
Out[63]:
array([[1, 0, 0],
[1, 0, 0],
[1, 0, 0],
[1, 1, 0]])
In [64]: np.bitwise_and.reduce(c) == c[0]
Out[64]: array([ True, True, True], dtype=bool)
Il secondo coumn è chiaramente sbagliato.Dobbiamo usare bitwise_or
per intrappolare nuovi bit:
In [66]: np.bitwise_or.reduce(c) == c[0]
Out[66]: array([ True, False, True], dtype=bool)
risposta definitiva
In [69]: np.logical_and(np.bitwise_or.reduce(a) == a[0], np.bitwise_and.reduce(a) == a[0])
Out[69]: array([ True, False, True], dtype=bool)
In [70]: np.logical_and(np.bitwise_or.reduce(b) == b[0], np.bitwise_and.reduce(b) == b[0])
Out[70]: array([ True, False, True], dtype=boo
In [71]: np.logical_and(np.bitwise_or.reduce(c) == c[0], np.bitwise_and.reduce(c) == c[0])
Out[71]: array([ True, False, True], dtype=bool)
Questo metodo è più restrittiva e meno elegante di suggerimento di ubunut di utilizzare all
, ma ha il vantaggio di non creare enormi array temporanei se il tuo contributo è enorme. Gli array temporanei dovrebbero essere grandi quanto la prima riga della matrice.
EDIT
Sulla base di questo Q/A e the bug I filed with numpy, la soluzione fornita funziona solo perché la matrice contiene zero e uno. Come accade, le operazioni bitwise_and.reduce()
visualizzate possono sempre restituire zero o uno solo perché bitwise_and.identity
è 1
, non -1
. Sto mantenendo questa risposta nella speranza che numpy
venga corretto e la risposta diventi valida.
Modifica
Sembra che ci saranno in effetti essere un cambiamento a numpy presto. Certamente a bitwise_and.identity
e forse anche un parametro facoltativo da ridurre.
Modifica
Buone notizie a tutti. L'identità per np.bitwise_and
è stata impostata su -1
a partire dalla versione 1.12.0
.
Questo problema mi ha infastidito per un po '. Mentre la soluzione di @ Ubuntu è abbastanza elegante, non è molto piacevole provare a eseguire questo su un array doppio 4096 ** 3 solo per ottenere un array booleano che si occupa di qualsiasi memoria rimasta. Stavo giocando con una pura implementazione Python usando 'np.equal (a, a [:, 0, None])', ma questo finisce con lo stesso problema. Sto quindi lavorando su un PR per numpy per aggiungere una nuova funzione 'np.same' per gestire esattamente questo tipo di situazione. –