Seite 1 von 1

Min in einem Array finden und indiziieren...

Verfasst: Donnerstag 10. Januar 2008, 19:49
von acidk
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!

Verfasst: Donnerstag 10. Januar 2008, 20:15
von 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)

Verfasst: Freitag 11. Januar 2008, 10:23
von acidk
@ Black Jack:

Vielen Dank!
Noch eine Frage: Wozu ist der doppelte Backslash? Würde hier nicht auch einer reichen?

Verfasst: Freitag 11. Januar 2008, 11:44
von Erwin
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.

Verfasst: Freitag 11. Januar 2008, 12:06
von 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.

Verfasst: Freitag 11. Januar 2008, 13:10
von Erwin
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.

Verfasst: Freitag 11. Januar 2008, 16:16
von HWK
Erwin hat geschrieben: bei '7 / 2' als Ergebnis '2.33...' ausgeben werden.
?????

Verfasst: Freitag 11. Januar 2008, 16:33
von BlackJack
Naja, kleine Rechenungenauigkeit; ±1.166666… halt. ;-)

Verfasst: Freitag 11. Januar 2008, 17:33
von Erwin
*autsch*

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

Habe es editiert.

Danke, HWK.

Verfasst: Montag 14. Januar 2008, 14:25
von mkesper
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.