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
9条答案
按热度按时间jvlzgdj91#
我能想到的唯一一件事,看起来更糟糕的是:
lg40wkob2#
恕我冒昧,但我似乎不能评论JoeCondron的回答。
我喜欢:
但我相信它还可以进一步简化:
似乎对我很管用(或非1D):
niwlg2el3#
我用它
它几乎快了4倍(60ms比230)!!
3npbholx4#
我认为这是一种非常简单的方法,如果代码的可读性是您主要关心的问题,那么这种方法可能会稍微好一些。但说真的,你的方式也同样优雅。
50few1ms5#
您要查找的值必须是
x.max()
或x.min()
,这样才能哪种解决方案类似于Aestrivex的解决方案,但可能更具可读性?注意:如果
x.min()
和x.max()
具有相同的绝对值,例如-5
和5
,这将返回最小值。如果您有偏好,只需相应地将输入排序为max
即可。pgx2nnw86#
这个函数快速计算关于任意
axis
参数的绝对max‘es,其方式与np.max
和np.argmax
本身的计算方式相同。对于长数组,即使对于简单的
axis=None
,它也比a.flat[abs(a).argmax()]
快2.5倍-因为它不呈现原始大数组的abs()。0aydgbwb7#
最紧凑的方式可能是:
默认情况下,
.argmax()
方法直接在展平的数组上操作(取自NumPy documentation)。因此,该操作查找n维数组np.abs(x)
的最大绝对值。gev0vcfq8#
我正在寻找一种方法来获得沿指定轴的N维数组的最大绝对值的有符号值,这些答案都无法处理。所以,我拼凑了一个函数来做这件事。不能保证,但就我测试过的情况而言,它是有效的:
jqjz2hbq9#
flat
和我的“xmax
”(实际上是“xmaxInd
”)来获得正确的值。因此,我认为你的解决方案是最好的。在尝试了一下之后,我意识到你可以这样做:
似乎NumPy允许您获取矩阵的
abs
和argmax
。多方便啊!timeit
检查:mean(t1.repeat(1,100000))
给予Out[99]: 7.854323148727417
mean(t2.repeat(1,100000))
给予Out[98]: 7.7788529396057129
所以
meth2()
稍微快一些。可能是因为它不涉及调用flat
。