2017-05-04 6 views
3

zum Beispiel:python warum gibt max (max (float_2d_array)) falsche antwort?

a = [[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], 
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], 
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], 
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], 
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], 
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], 
[0.0, 0.0, 1.2852976787772832, 0.00092, 0.0, 0.0, 0.0, 0.0, 0.0], 
[0.0, 0.0, 0.0, 6.409872844109646, 0.17506688391255013, 0.0, 0.0, 0.0, 0.0], 
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], 
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], 
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], 
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], 
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]] 
print max(max(a)) 
print max(a) 

Das Ergebnis ist:

1,28529767878

[0.0, 0.0, 1,2852976787772832, 0,00092, 0.0, 0.0, 0.0, 0.0, 0.0]

Dies ist eindeutig falsch, der Maximalwert sollte 6.409872844109646 sein.

b = [] 
for i in a: 
    b.extend(i) 
print max(b) 

6,40987284411

Dies ist Python 2.7, CPython.

Vielen Dank.

+0

warum erwarten Sie 6,409872844109646? .... 1,2852976787772832 sieht aus wie der max mir – depperm

+0

Sie die richtige Antwort mit numpy bekommen können: 'Druck numpy.max (a)' – Nuageux

+3

Ihre Erwartung von 'max (a)' ist nicht richtig. Es wird dir nicht die Liste geben, die die maximale Anzahl hat. – yeniv

Antwort

6

Listen werden elementweise sortiert. Da der Index der 1.2852976787772832 einen Platz vor, dass der 6.409872844109646 in den Kandidaten Sublisten ist, wird die Liste der ehemaligen enthält wird als Maximum gepflückt.

Im gleichen Index in der zweiten Liste, haben wir ein 0 und 1.2852976787772832 als 0 deutlich größer ist:

[0.0, 0.0, 1.2852976787772832, 0.00092, 0.0, 0.0, 0.0, 0.0, 0.0], 
[0.0, 0.0, 0.0, 6.409872844109646, 0.17506688391255013, 0.0, 0.0, 0.0, 0.0] 
#   ^here's your tie-breaker 

In der Tat ist der nächste Index enthält 6.4... nie geprüft.

Ich bin nicht sicher, wie Sie die maximale sublist erwarten ausgewählt werden: sublist mit maximaler Summe, sublist enthält maximale Anzahl? Sie müssen das gewünschte Verhalten codieren, wenn das Standardverhalten es nicht schneidet.

+1

vielleicht wird die Mechanik deutlicher, wenn Sie Listen von Zahlen mit Zeichenfolgen vergleichen, die - zu Illustrationszwecken - als Listen von Zeichen betrachtet werden können. Alphabetisch kommt "aba" nach "aac". Gleiches gilt für "010", das hinter "002" sortiert ist. – aleneum

+1

Verstanden! Danke, Moses! – user7586189

1

Moses bereits erklärt, warum SieFormal das falsche Ergebnis bekam: erstes Element größer als die anderen „gewinnt“, wenn Listen zu vergleichen.

der maximale Wert, den Sie haben Um Liste abflachen:

print(max(x for l in a for x in l)) 
+0

Ja, das funktioniert auch! –

+0

um ehrlich zu sein, ich habe nur selten 'key' mit' max' verwendet. Es ist nur interessant, wenn Sie einen Datenwert benötigen, der auf den Maximalwert bezogen ist, aber nicht den Wert selbst. –