2013-07-22 3035 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()。

相关问题