2016-07-27 2 views
0

Ich habe ein paar Probleme zu verstehen, wie Python/Numpy Array-Formen beim Vergleich mit einer leeren Liste wirft - was soweit ich verstehe - ist ein impliziter (elementweiser) Vergleich mit False.Form eines numpigen Array Vergleich mit einer leeren Liste

Im folgende Beispiel nimmt die Form, die durch einen in der letzten Dimension, wenn es nicht mehr als 1.

z = N.zeros((2,2,1)) 
z == [] 

>> array([], shape=(2, 2, 0), dtype=bool) 

z2 = N.zeros((2,2,2)) 
z2 ==[] 

>> False 

ist Wenn ich aber vergleichen mit falschem direkt, ich die erwarteten Ausgabe erhalten.

z = N.zeros((2,2,1)) 
(z == False).shape 

>> (2, 2, 2) 


z2 = N.zeros((2,2,2)) 
(z2 == False).shape 

>> (2, 2, 1) 

Antwort

2

Dies ist normale Sendung bei der Arbeit. Wenn Sie das tun

z = N.zeros((2,2,1)) 
z == [] 

[] als ein Array von Form interpretiert wird (0,), und dann werden die Formen gegeneinander ausgestrahlt:

(2, 2, 1) 
vs (0,) 

Da (0,) kürzer als (2, 2, 1), wird es erweitert, als ob Das Array wurde wiederholt kopiert:

und da gibt es eine 1 in der ersten Form und die andere Form hat keine 1 befindet, wobei die erste Form „erweitert“ wird, als ob es Null mal kopiert wurde:

(2, 2, 0) 
vs (2, 2, 0) 

Der Vergleich resultiert somit in einer Anordnung von booleans mit Form (2, 2, 0).


Wenn z hat (2, 2, 2) Form:

z2 = N.zeros((2,2,2)) 
z2 ==[] 

Rundfunk versagt, da eine Länge-2-Achse und eine Länge-0-Achse können nicht gegeneinander ausgestrahlt werden. NumPy berichtet, dass sie nicht weiß, wie der Vergleich auszuführen:

>>> numpy.zeros([2, 2, 2]).__eq__([]) 
NotImplemented 

Die Liste nicht weiß, wie entweder, so Python wieder auf dem Standard Vergleich von Identität fällt, und erhält ein Ergebnis von False.


Wenn Sie vergleichen gegen False:

z = N.zeros((2,2,1)) 
(z == False).shape 

False als ein Array von Form interpretiert wird () - eine leere Form! Das wird in Form gebracht, um (2, 2, 1) zu formen, als ob es in ein Array voller False s kopiert würde, so dass das Ergebnis die gleiche Form wie z hat.

+0

Ich verstand die Übertragung immer als Erweiterung der Ausgabe-Array auf die maximale Form der beiden Eingabe-Arrays (falls zutreffend). In diesem Fall ist das nicht wahr. Danke fürs klarstellen! – dbacc

+1

Nur Größe '1' Dimensionen werden geändert, um mit den anderen übereinzustimmen. Eine Größe "2" wird niemals auf die Größe "4" erweitert. Ich hätte die Sendefolge wie folgt beschrieben: (2,2,1), (0,) => (2,2,1), (1,1,0) => (2,2,0) '. Alle "1" wurden geändert. – hpaulj

Verwandte Themen