2013-07-22 10 views

Antwort

1

Das einzige, was ich denken konnte, was noch schlimmer aussieht, ist:

xmax=x[np.unravel_index(abs(x).argmax(), x.shape)] 
2

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.

+1

Dies ergibt 3, nicht -3, nicht wirklich, was die Frage stellt. – Daniel

+0

@Ophion das ist ein guter Punkt, ich wurde durch die Indizes verwirrt. Ich denke, du musst dann "flach" benutzen. –

0

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) 
6

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 
+0

Gute Antwort !! Ich würde p = abs (maxa) ändern ** ** ** abs (mina) zu p = abs (maxa) **> = ** abs (mina) – idoo

18

Der Wert für Sie suchen entweder x.max() oder x.min() so sein, könnten Sie

tun
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.

2

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.

Verwandte Themen