Min in einem Array finden und indiziieren...

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
acidk
User
Beiträge: 75
Registriert: Samstag 6. Januar 2007, 18:54
Wohnort: Braunschweig

Hi!
Ich möchte mir aus einem Array das globale Minimum rausziehen und die Inizes
dieser Position ermitteln.

mein Ansatz:

Code: Alles auswählen

vector = array([[6, 23,-6,-40],[1,18,-16,4],[8,9,-23,10]])
print vector
minindex = vector.argmin()
print minindex
print vector.ravel()[minindex], "Gibt Minimum zurueck"
Wie kann ich den min Index (0,3) ermitteln? Gibt es hier einen eleganten Weg /Befehl in numpy oder muß ich das ganze umständlich über den Minindex zurückverfolgen?

Danke!
BlackJack

Ist keine besonders schöne Lösung, aber es ginge so:

Code: Alles auswählen

In [143]: vector
Out[143]:
array([[  6,  23,  -6, -40],
       [  1,  18, -16,   4],
       [  8,   9, -23,  10]])

In [144]: minindex = vector.argmin()

In [145]: x = vector.shape[1]

In [146]: (minindex // x, minindex % x)
Out[146]: (0, 3)
acidk
User
Beiträge: 75
Registriert: Samstag 6. Januar 2007, 18:54
Wohnort: Braunschweig

@ Black Jack:

Vielen Dank!
Noch eine Frage: Wozu ist der doppelte Backslash? Würde hier nicht auch einer reichen?
Erwin
User
Beiträge: 141
Registriert: Donnerstag 9. Juni 2005, 08:51

acidk hat geschrieben: Noch eine Frage: Wozu ist der doppelte Backslash? Würde hier nicht auch einer reichen?
Ich vermute mal, dass in allen Variablen Zahlen sind?
Was Zahlen betrifft, so bewirkt der doppelte Backslash, dass als Ergebnis eine ganze Abgerundete Zahl ausgeben wird.
Wenn alles Integer sind (also Ganze Zahlen), spielt es keinen Unterschied.
Wenn aber eine Float-Zahl vorkommt (z.B. "7 / 3.0"), dann schon.
Dann wird das Ergebnis mit Komma ausgegeben (2.3333..).
Während beim '//' nach wie vor nur eine ganze Abgerundete Zahl ausgeben wird (2.0).
Einfach mal mit einfachen Zahlen testen.
Habe es mit Python 2.5.1 (IDLE) getestet.
Ich mache nie einen Fehler Zweimal.
Schließlich ist die Auswahl ja groß genug.
BlackJack

Es macht einen Unterschied, auch bei Integer-Objekten, wenn ``from __future__ import division`` oben im Modul steht. Und aus dem Grund wird es auch in Python 3.0 einen Unterschied machen, weil dort dieser Import sozusagen implizit ist.
Erwin
User
Beiträge: 141
Registriert: Donnerstag 9. Juni 2005, 08:51

BlackJack hat geschrieben:Es macht einen Unterschied, auch bei Integer-Objekten, wenn ``from __future__ import division`` oben im Modul steht. Und aus dem Grund wird es auch in Python 3.0 einen Unterschied machen, weil dort dieser Import sozusagen implizit ist.
Stimmt.
Wusste doch, dass da was war, eine lang angekündigte Veränderung.
Wusste aber nicht mehr genau was. Jetzt weiß ich es wieder.
Da soll die Funktion '/' dem von Float angepasst werden, oder?
Also in Zukunft auch bei zwei Integer; bei '7 / 3' als Ergebnis '2.33...' ausgeben werden. Und macht es auch jetzt schon, wenn man das future importiert.

Deshalb auch von Dir her das doppelte ('//'), damit einfach generell keinen Ärger gibt.
Funktioniert jetzt und funktioniert auch später.


edit:
Einen Zahlen-Fehler geändert bzw. richtig gestellt: aus '7 / 2' habe ich '7 / 3' gemacht.
Weil sonst ja das Ergebnis falsch ist.
Zuletzt geändert von Erwin am Freitag 11. Januar 2008, 17:32, insgesamt 1-mal geändert.
Ich mache nie einen Fehler Zweimal.
Schließlich ist die Auswahl ja groß genug.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Erwin hat geschrieben: bei '7 / 2' als Ergebnis '2.33...' ausgeben werden.
?????
BlackJack

Naja, kleine Rechenungenauigkeit; ±1.166666… halt. ;-)
Erwin
User
Beiträge: 141
Registriert: Donnerstag 9. Juni 2005, 08:51

*autsch*

7 / 3 sollte es heißen, nicht 7 / 2.

Habe es editiert.

Danke, HWK.
Ich mache nie einen Fehler Zweimal.
Schließlich ist die Auswahl ja groß genug.
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Erwin hat geschrieben:Deshalb auch von Dir her das doppelte ('//'), damit einfach generell keinen Ärger gibt.
Funktioniert jetzt und funktioniert auch später.
Leider nein. Nach http://wiki.python.org/moin/FutureProofPython dreht sich das Verhalten in Zukunft um.
Besser ist daher IMHO grundsätzlich jetzt schon

Code: Alles auswählen

from __future__ import division
zu verwenden.
Antworten