沿轴获得最大绝对值

时间:2018-07-06 11:54:32

标签: python numpy

我有几个ndarrays,它们的形状相同,我想得到一个数组(形状相同),每个元素的绝对值最大。因此,我决定堆叠所有数组,然后沿新的堆叠轴选择值。但是该怎么做?

示例

假设我们有两个一维数组,每个数组有4个元素,所以我的堆叠数组看起来像

>>> stack
array([[ 4,  1,  2,  3],
       [ 0, -5,  6,  7]])

如果我只想对最大数量感兴趣,那么

>>> numpy.amax(stack, axis=0)
array([4, 1, 6, 7])

但是我也需要考虑负值,所以我打算

>>> ind = numpy.argmax(numpy.absolute(stack), axis=0)
>>> ind
array([0, 1, 1, 1])

因此,现在我有了所需的索引,但是如何将其应用于堆叠数组?如果我只是将stack索引为ind,那么numpy正在做一些我不需要的广播工作:

>>> stack[ind]
array([[ 4,  1,  2,  3],
       [ 0, -5,  6,  7],
       [ 0, -5,  6,  7],
       [ 0, -5,  6,  7]])

我想要得到的是array([4, -5, 6, 7])

或者从稍微不同的角度提出问题:如何根据numpy.amax(stack, axis=0)返回的索引获取数组numpy.argmax(stack, axis=0)

3 个答案:

答案 0 :(得分:3)

堆叠操作效率低下。我们可以简单地使用np.where根据绝对值比较进行选择-

In [198]: a
Out[198]: array([4, 1, 2, 3])

In [199]: b
Out[199]: array([ 0, -5,  6,  7])

In [200]: np.where(np.abs(a) > np.abs(b), a, b)
Out[200]: array([ 4, -5,  6,  7])

这无需修改即可在通用n维数组上工作。

答案 1 :(得分:2)

如果您具有2D numpy ndarray,则不再适用经典索引。因此,要实现所需的功能,以避免产生麻烦,还必须使用2D数组进行索引:

>>> stack[[ind,np.arange(stack.shape[1])]]
array([ 4, -5,  6,  7])

答案 2 :(得分:0)

对于“普通” Python:

ldapmodify -x -W -D "cn=Manager,dc=domain,dc=com"  -H ldapi:/// -f certs.ldif

Enter LDAP Password: 

 modifying entry "cn=config"

也许它也可以应用到>>> a=[[1,2],[3,4]] >>> b=[0,1] >>> [x[y] for x,y in zip(a,b)] [1, 4] 上,我对Numpy不够熟悉。