这是我目前在做什么,它的工作原理,但它是一个有点麻烦:如何获得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()。
它对我来说看起来很优雅......?平坦缓慢还是什么?因为说实话,这看起来真的很不错。 –