Hier ist, was ich derzeit tue, es funktioniert, aber es ist ein wenig umständlich:Wie erhält man das höchste Element in absoluten Zahlen in einer Matrix?
x = np.matrix([[1, 1], [2, -3]])
xmax = x.flat[abs(x).argmax()]
Hier ist, was ich derzeit tue, es funktioniert, aber es ist ein wenig umständlich:Wie erhält man das höchste Element in absoluten Zahlen in einer Matrix?
x = np.matrix([[1, 1], [2, -3]])
xmax = x.flat[abs(x).argmax()]
Das einzige, was ich denken konnte, was noch schlimmer aussieht, ist:
xmax=x[np.unravel_index(abs(x).argmax(), x.shape)]
EDIT: Meine Antwort ist off-topic, sorry. Wie Ophion darauf hinwies, würde dies den Index und nicht den Wert zurückgeben - Sie müssen flat
mit meinem "xmax
" verwenden (was wirklich "xmaxInd
" ist), um den richtigen Wert zu erhalten. Ergo denke ich, deine Lösung ist die beste.
Nach ein wenig experimentiert wurde mir klar, man kann dies nur tun:
x = np.matrix([[1,1], [2,-3]])
absX = abs(x)
xmax = argmax(absX)
Es scheint, dass numpy Sie die abs
sowie die argmax
einer Matrix nehmen können. Wie praktisch!
timeit
Kontrollen:
def meth1():
x = np.matrix([[1,1],[2,-3]])
xmax = x.flat[abs(x).argmax()]
def meth2():
x = np.matrix([[1,1],[2,-3]])
xmax = argmax(abs(x))
t1 = timeit.Timer("meth1()","from __main__ import meth1")
t2 = timeit.Timer("meth2()","from __main__ import meth2")
mean(t1.repeat(1,100000))
gibt Out[99]: 7.854323148727417
mean(t2.repeat(1,100000))
gibt Out[98]: 7.7788529396057129
So meth2()
etwas schneller ist. Wahrscheinlich, weil es keinen Aufruf von flat
erfordert.
Dies ergibt 3, nicht -3, nicht wirklich, was die Frage stellt. – Daniel
@Ophion das ist ein guter Punkt, ich wurde durch die Indizes verwirrt. Ich denke, du musst dann "flach" benutzen. –
Ich denke, das ist ein ziemlich einfacher Weg, der etwas besser sein könnte, wenn die Lesbarkeit des Codes das Hauptanliegen ist. Aber wirklich, dein Weg ist genauso elegant.
np.min(x) if np.max(abs(x)) == abs(np.min(x)) else np.max(x)
ich nach einem Weg suchen, um die signierten Werte der maximalen absoluten Werte einer N-dimensionalen Array entlang einer bestimmten Achse, die keine dieser Antworten zu bekommen behandeln. Also habe ich eine Funktion zusammengestellt, um das zu tun. Keine Versprechungen, aber es funktioniert soweit ich es getestet habe:
def maxabs(a, axis=None):
"""Return slice of a, keeping only those values that are furthest away
from 0 along axis"""
maxa = a.max(axis=axis)
mina = a.min(axis=axis)
p = abs(maxa) > abs(mina) # bool, or indices where +ve values win
n = abs(mina) > abs(maxa) # bool, or indices where -ve values win
if axis == None:
if p: return maxa
else: return mina
shape = list(a.shape)
shape.pop(axis)
out = np.zeros(shape, dtype=a.dtype)
out[p] = maxa[p]
out[n] = mina[n]
return out
Gute Antwort !! Ich würde p = abs (maxa) ändern ** ** ** abs (mina) zu p = abs (maxa) **> = ** abs (mina) – idoo
Der Wert für Sie suchen entweder x.max()
oder x.min()
so sein, könnten Sie
max(x.min(), x.max(), key=abs)
, die ähnlich zur Lösung von aestrivex, aber vielleicht besser lesbar? Beachten Sie, dass dies das Minimum in dem Fall zurückgibt, in dem x.min()
und x.max()
denselben absoluten Wert haben, z. -5
und 5
. Wenn Sie eine Präferenz haben, ordnen Sie die Eingaben entsprechend max
zu.
Dieser berechnet die absolute max'es schnell - ein beliebiges axis
Argument in der gleichen Weise wie np.max
und np.argmax
respektieren selbst tun.
def absmaxND(a, axis=None):
amax = a.max(axis)
amin = a.min(axis)
return np.where(-amin > amax, amin, amax)
Für lange Arrays sein ungefähr 2,5x schneller als a.flat[abs(a).argmax()]
auch für den einfachen Fall axis=None
- weil es nicht abs nicht machen() des ursprünglichen großen Array.
Es sieht ziemlich elegant für mich aus ...? Ist flach langsam oder so? Denn ehrlich gesagt sieht das wirklich gut aus. –