2013-07-22 4 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))を与えるのでmeth2()がわずかに速いですOut[98]: 7.7788529396057129

を与えます。おそらくflatを呼び出す必要がないためです。

+1

これは-3ではなく、3を返します。 – Daniel

+0

@Ophionそれは良い点です、私はインデックスによって混乱しました。私はあなたが 'フラット'を使用しなければならないと思う。 –

0

これはかなり簡単な方法だと思いますが、コードの可読性が主な関心事である場合は、少し上手くいくかもしれません。しかし、本当に、あなたのやり方はまるでエレガントです。

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

Iは、これらの答えのいずれも処理しない指定された軸に沿って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

あなたが探している値は、あなたが似ている

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

を行うことができx.max()またはx.min()のいずれかである必要がありませんaestrivexのソリューションには、おそらくもっと読みやすいでしょうか?これは、x.min()x.max()が同じ絶対値を持つ場合の最小値を返します。 -5および5。あなたが好むならば、それに応じて入力をmaxに並べてください。

2

これは、任意のaxis引数を高速で絶対最大値として、np.maxおよびnp.argmaxと同じ方法で計算します。長い配列の場合

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

その程度2.5倍にも簡単なケースaxis=Noneためa.flat[abs(a).argmax()]より速い - それは、元の大きさの配列の腹筋を()レンダリングされませんので。