numpy 如何求一个数阵中绝对值最大的元素?

bcs8qyzn  于 2022-11-10  发布在  其他
关注(0)|答案(9)|浏览(195)

以下是我目前正在做的事情,它是有效的,但它有点麻烦:

x = np.matrix([[1, 1], [2, -3]])
xmax = x.flat[abs(x).argmax()]
jvlzgdj9

jvlzgdj91#

我能想到的唯一一件事,看起来更糟糕的是:

xmax=x[np.unravel_index(abs(x).argmax(), x.shape)]
lg40wkob

lg40wkob2#

恕我冒昧,但我似乎不能评论JoeCondron的回答。
我喜欢:

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

但我相信它还可以进一步简化:

max(x, key=abs)

似乎对我很管用(或非1D):

max(x.flat, key=abs)
niwlg2el

niwlg2el3#

我用它

dt = np.random.rand(50000,500)-0.5

# ur

xmax = dt.flat[abs(dt).argmax()] #230 ms

# new

newdt = np.array([dt.min(),dt.max()]) # 56ms
xmax = newdt.flat[abs(newdt).argmax()] # 4ms

它几乎快了4倍(60ms比230)!!

3npbholx

3npbholx4#

我认为这是一种非常简单的方法,如果代码的可读性是您主要关心的问题,那么这种方法可能会稍微好一些。但说真的,你的方式也同样优雅。

np.min(x) if np.max(abs(x)) == abs(np.min(x)) else np.max(x)
50few1ms

50few1ms5#

您要查找的值必须是x.max()x.min(),这样才能

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

哪种解决方案类似于Aestrivex的解决方案,但可能更具可读性?注意:如果x.min()x.max()具有相同的绝对值,例如-55,这将返回最小值。如果您有偏好,只需相应地将输入排序为max即可。

pgx2nnw8

pgx2nnw86#

这个函数快速计算关于任意axis参数的绝对max‘es,其方式与np.maxnp.argmax本身的计算方式相同。

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

对于长数组,即使对于简单的axis=None,它也比a.flat[abs(a).argmax()]快2.5倍-因为它不呈现原始大数组的abs()。

0aydgbwb

0aydgbwb7#

最紧凑的方式可能是:

x_max = x.flat[np.abs(x).argmax()]

默认情况下,.argmax()方法直接在展平的数组上操作(取自NumPy documentation)。因此,该操作查找n维数组np.abs(x)的最大绝对值。

gev0vcfq

gev0vcfq8#

我正在寻找一种方法来获得沿指定轴的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
jqjz2hbq

jqjz2hbq9#

  • 编辑*:我的回答跑题了,抱歉。正如Ophion指出的那样,这将返回索引,而不是值-您必须使用flat和我的“xmax”(实际上是“xmaxInd”)来获得正确的值。因此,我认为你的解决方案是最好的。

在尝试了一下之后,我意识到你可以这样做:

x = np.matrix([[1,1], [2,-3]])
absX = abs(x)
xmax = argmax(absX)

似乎NumPy允许您获取矩阵的absargmax。多方便啊!
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.854323148727417mean(t2.repeat(1,100000))给予Out[98]: 7.7788529396057129
所以meth2()稍微快一些。可能是因为它不涉及调用flat

相关问题