Wie überprüfe man, ob alle Werte in den Spalten einer numpy Matrix gleich sind?

Ich möchte überprüfen, ob alle Werte in den Spalten eines numpy Arrays / Matrix gleich sind. Ich habe versucht, die reduce der ufunc equal , aber es scheint nicht in allen Fällen zu arbeiten:

 In [55]: a = np.array([[1,1,0],[1,-1,0],[1,0,0],[1,1,0]]) In [56]: a Out[56]: array([[ 1, 1, 0], [ 1, -1, 0], [ 1, 0, 0], [ 1, 1, 0]]) In [57]: np.equal.reduce(a) Out[57]: array([ True, False, True], dtype=bool) In [58]: a = np.array([[1,1,0],[1,0,0],[1,0,0],[1,1,0]]) In [59]: a Out[59]: array([[1, 1, 0], [1, 0, 0], [1, 0, 0], [1, 1, 0]]) In [60]: np.equal.reduce(a) Out[60]: array([ True, True, True], dtype=bool) 

Warum wird die mittlere Spalte im zweiten Fall auch auf True ausgewertet, während es False ?

Danke für jede Hilfe!

2 Solutions collect form web for “Wie überprüfe man, ob alle Werte in den Spalten einer numpy Matrix gleich sind?”

 In [45]: a Out[45]: array([[1, 1, 0], [1, 0, 0], [1, 0, 0], [1, 1, 0]]) 

Vergleichen Sie jeden Wert mit dem entsprechenden Wert in der ersten Zeile:

 In [46]: a == a[0,:] Out[46]: array([[ True, True, True], [ True, False, True], [ True, False, True], [ True, True, True]], dtype=bool) 

Eine Spalte teilt einen gemeinsamen Wert, wenn alle Werte in dieser Spalte True sind:

 In [47]: np.all(a == a[0,:], axis = 0) Out[47]: array([ True, False, True], dtype=bool) 

Das Problem mit np.equal.reduce kann durch np.equal.reduce gesehen werden, was passiert, wenn es auf [1, 0, 0, 1] angewendet wird:

 In [49]: np.equal.reduce([1, 0, 0, 1]) Out[50]: True 

Die ersten beiden Punkte, 1 und 0 werden auf Gleichheit geprüft und das Ergebnis ist False :

 In [51]: np.equal.reduce([False, 0, 1]) Out[51]: True 

Nun werden False und 0 auf Gleichheit geprüft und das Ergebnis ist True :

 In [52]: np.equal.reduce([True, 1]) Out[52]: True 

Aber True und 1 sind gleich, also ist das Gesamtergebnis True , was nicht das gewünschte Ergebnis ist.

Das Problem ist, dass reduce versucht, das Ergebnis "lokal" zu akkumulieren, während wir einen "globalen" Test wie np.all .

Angesichts der ubuntu's ehrfürchtige Erklärung, können Sie reduce , um Ihr Problem zu lösen, aber Sie müssen es auf bitwise_and und bitwise_or anstatt equal anwenden. Infolgedessen wird dies nicht mit Gleitkomma-Arrays funktionieren:

 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) 

Grundsätzlich vergleicht man die Bits jedes Elements in der Spalte. Gleiche Bits sind unverändert. Unterschiedliche Bits werden auf Null gesetzt. Auf diese Weise wird eine beliebige Zahl, die anstelle eines Eins eine Null hat, den reduzierten Wert ändern. bitwise_and wird nicht den Fall, wo Bits eingeführt werden, anstatt entfernt:

 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) 

Die zweite Spalte ist eindeutig falsch. Wir müssen bitwise_or , um neue Bits zu fangen:

 In [66]: np.bitwise_or.reduce(c) == c[0] Out[66]: array([ True, False, True], dtype=bool) 

Endgültige Antwort

 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) 

Diese Methode ist restriktiver und weniger elegant als ubunuts Vorschlag, all , aber es hat den Vorteil, keine enormen temporären Arrays zu erzeugen, wenn deine Eingabe enorm ist. Die temporären Arrays sollten nur so groß sein wie die erste Zeile deiner Matrix.

BEARBEITEN

Basierend auf diesem Q / A und dem Bug, den ich mit numpy eingereicht habe , funktioniert die Lösung nur, weil dein Array Nullen und Eins enthält. Wie es passiert, können die bitwise_and.reduce() Operationen nur null oder eins zurückgeben, da bitwise_and.identity 1 , nicht -1 . Ich numpy diese Antwort in der Hoffnung, dass numpy wird fixiert und die Antwort wird gültig.

Bearbeiten

Sieht aus wie es wird in der Tat eine Änderung zu numpy bald sein. Sicherlich auf bitwise_and.identity , und evtl. auch ein optionaler Parameter zu reduzieren.

Bearbeiten

Gute Neuigkeiten alle zusammen. Die Identität für np.bitwise_and wurde ab Version 1.12.0 auf -1 1.12.0 .

  • Block tridiagonale Matrix Python
  • Itering über Numpy Matrix Zeilen, um eine Funktion jeweils anzuwenden?
  • Semantik der Erzeugung von symmetrischen Matrizen in numpy
  • Sehr große Matrizen mit Python und NumPy
  • Numpy 'smart' symmetrische Matrix
  • Erzeugen eine gemusterte numpy Matrix
  • Was ist der schnellste Weg, um Eigenwerte / Vektoren in Python zu finden?
  • Wie kann ich die nächstgelegene positive halbdefinierte Matrix berechnen?
  • Python ist die beste Programmiersprache der Welt.