這是我目前在做什麼,它的工作原理,但它是一個有點麻煩:如何獲得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))
給Out[98]: 7.7788529396057129
所以meth2()
稍快一些。可能因爲它不涉及致電flat
。
這返回3,而不是-3,不是真正問題的要求。 – Daniel
@Ophion這是一個很好的觀點,我對這些指數感到困惑。那麼我認爲你必須使用'flat'。 –
我認爲這是一個非常簡單的方法,如果代碼可讀性是您最關心的問題,這可能會稍微好一些。但是,真的,你的方式同樣優雅。
np.min(x) if np.max(abs(x)) == abs(np.min(x)) else np.max(x)
我正在尋找一種方法來獲取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
你正在尋找的價值,必須爲x.max()
或x.min()
,所以你可以做
max(x.min(), x.max(), key=abs)
類似於到aestrivex的解決方案,但也許更具可讀性?注意這將在x.min()
和x.max()
具有相同絕對值的情況下返回最小值,例如, -5
和5
。如果您有偏好,請相應地將訂單輸入max
。
這一個快速計算絕對最大值 - 參照np.max
和np.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()。
它對我來說看起來很優雅......?平坦緩慢還是什麼?因爲說實話,這看起來真的很不錯。 –