は、私が現在やっているものです、それは動作しますが、それは少し面倒です:numpy行列で絶対値で最高の要素を取得する方法は?ここ
x = np.matrix([[1, 1], [2, -3]])
xmax = x.flat[abs(x).argmax()]
は、私が現在やっているものです、それは動作しますが、それは少し面倒です:numpy行列で絶対値で最高の要素を取得する方法は?ここ
x = np.matrix([[1, 1], [2, -3]])
xmax = x.flat[abs(x).argmax()]
さらに悪いことになります私は考えることができる唯一の事は、次のとおりです。
xmax=x[np.unravel_index(abs(x).argmax(), x.shape)]
編集:私の答えは話題外です、申し訳ありません。 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
を呼び出す必要がないためです。
これは-3ではなく、3を返します。 – Daniel
@Ophionそれは良い点です、私はインデックスによって混乱しました。私はあなたが 'フラット'を使用しなければならないと思う。 –
これはかなり簡単な方法だと思いますが、コードの可読性が主な関心事である場合は、少し上手くいくかもしれません。しかし、本当に、あなたのやり方はまるでエレガントです。
np.min(x) if np.max(abs(x)) == abs(np.min(x)) else np.max(x)
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
良かったです!私はp = abs(maxa)**> ** abs(mina)にp = abs(maxa)**> ** abs(mina) – idoo
あなたが探している値は、あなたが似ている
max(x.min(), x.max(), key=abs)
を行うことができx.max()
またはx.min()
のいずれかである必要がありませんaestrivexのソリューションには、おそらくもっと読みやすいでしょうか?これは、x.min()
とx.max()
が同じ絶対値を持つ場合の最小値を返します。 -5
および5
。あなたが好むならば、それに応じて入力をmax
に並べてください。
これは、任意の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()]
より速い - それは、元の大きさの配列の腹筋を()レンダリングされませんので。
私はかなりエレガントに見える...?フラットな感じですか?正直なところ、これは本当に素晴らしいと思うので、 。 –