2013-07-22 3030 views
15

這是我目前在做什麼,它的工作原理,但它是一個有點麻煩:如何獲得numpy矩陣中絕對值的最高元素?

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

它對我來說看起來很優雅......?平坦緩慢還是什麼?因爲說實話,這看起來真的很不錯。 –

回答

1

,我能想到的唯一的事情,看起來更可怕的是:

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

編輯:我的答案是離題,對不起。正如Ophion指出,這將返回索引,而不是價值 - 你必須使用flat和我的「xmax」(這實際上是「xmaxInd」)才能獲得正確的價值。埃爾戈我認爲你的解決方案是最好的。


試驗了一下後,我意識到你可以這樣做:

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

看來numpy的讓你拿abs以及矩陣的argmax。多麼方便!

timeit檢查:

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

所以meth2()稍快一些。可能因爲它不涉及致電flat

+1

這返回3,而不是-3,不是真正問題的要求。 – Daniel

+0

@Ophion這是一個很好的觀點,我對這些指數感到困惑。那麼我認爲你必須使用'flat'。 –

0

我認爲這是一個非常簡單的方法,如果代碼可讀性是您最關心的問題,這可能會稍微好一些。但是,真的,你的方式同樣優雅。

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

我正在尋找一種方法來獲取N維數組沿着指定軸的最大絕對值的符號值,這些答案都不處理。所以,我把一個功能放在一起。沒有承諾,但它的工作原理據我測試過它:

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

好答案!我會將p = abs(maxa)**> ** abs(mina)改爲p = abs(maxa)**> = ** abs(mina) – idoo

18

你正在尋找的價值,必須爲x.max()x.min(),所以你可以做

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

類似於到aestrivex的解決方案,但也許更具可讀性?注意這將在x.min()x.max()具有相同絕對值的情況下返回最小值,例如, -55。如果您有偏好,請相應地將訂單輸入max

2

這一個快速計算絕對最大值 - 參照np.maxnp.argmax自己所做的相同的方式參照任意axis參數。

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

對於長的陣列其約2.5倍比a.flat[abs(a).argmax()]快,即使是簡單的情況下axis=None - 因爲它不會使原有的大陣列的ABS()。

相關問題