2013-07-22 10 views

Odpowiedz

1

Jedyne co mogę myśleć, co wygląda jeszcze gorzej, to:

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

EDYTOWANIE: Moja odpowiedź jest nie na temat, przepraszam. Jak zauważył Ophion, to zwróci indeks, a nie wartość - musisz użyć flat z moim "xmax" (co jest naprawdę "xmaxInd"), aby uzyskać właściwą wartość. Ergo Myślę, że twoje rozwiązanie jest najlepsze.


Po eksperymentach trochę zdałem sobie sprawę, można po prostu to zrobić:

x = np.matrix([[1,1], [2,-3]]) 
absX = abs(x) 
xmax = argmax(absX) 

Wydaje się, że numpy pozwala wziąć abs jak również argmax matrycy. Jak wygodnie!

timeit sprawdza:

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)) daje Out[99]: 7.854323148727417 mean(t2.repeat(1,100000)) daje Out[98]: 7.7788529396057129

Więc meth2() jest nieco szybciej. Prawdopodobnie dlatego, że nie wymaga wywoływania flat.

+1

To zwraca 3, nie -3, nie tak naprawdę pytanie zadaje. – Daniel

+0

@Ophion to dobry punkt, byłem zdezorientowany przez wskaźniki. Myślę, że musisz wtedy użyć 'flat'. –

0

Myślę, że jest to dość prosty sposób, który może być nieco lepszy, jeśli najważniejsza jest czytelność kodu. Ale tak naprawdę, twoja droga jest równie elegancka.

np.min(x) if np.max(abs(x)) == abs(np.min(x)) else np.max(x) 
6

szukałem sposobu, aby uzyskać podpisane wartości maksymalnych wartościach bezwzględnych tablicy n-wymiarowej wzdłuż określonej osi, która obsługiwać żadna z tych odpowiedzi. Tak więc przygotowałem funkcję, aby to zrobić. Nie obiecuje, ale to działa w miarę Przetestowałem go:

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

Dobra odpowiedź !! Zmienilbym p = abs (maxa) **> ** abs (mina) na p = abs (maxa) **> = ** abs (mina) – idoo

18

Wartość szukasz musi być x.max() lub x.min() więc można zrobić

max(x.min(), x.max(), key=abs) 

który jest podobny do rozwiązania aestrivex, ale być może bardziej czytelne? Należy zauważyć, że zwróci to minimum w przypadku, gdy x.min() i x.max() mają taką samą wartość bezwzględną, np. -5 i 5. Jeśli masz preferencję, po prostu zamów wejścia na odpowiednio max.

2

Ten oblicza bezwzględne maksimum szybko - respektując dowolny argument axis w taki sam sposób jak robią to np.max i np.argmax.

def absmaxND(a, axis=None): 
    amax = a.max(axis) 
    amin = a.min(axis) 
    return np.where(-amin > amax, amin, amax) 

przypadku długich tablic jego około 2,5x szybciej niż a.flat[abs(a).argmax()] nawet dla prostego przypadku axis=None - ponieważ nie czynią abs() oryginalnego wielkim tablicy.

Powiązane problemy