numpy ND数组:沿着某个轴取索引元素(ND choose)

2024-09-25 08:28:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我得到沿某一轴的指数。例如,当2D和axis=-1时:

>>> axis = -1
>>> a = rand(5, 3) - 0.5;  a
array([[ 0.49970414, -0.14251437,  0.2881351 ],
       [ 0.3280437 ,  0.33766112,  0.4263927 ],
       [ 0.37377502,  0.05392274, -0.4647834 ],
       [-0.09461463, -0.25347861, -0.29381079],
       [-0.09642799,  0.15729681,  0.06048399]])
>>> axisinds = a.__abs__().argmax(axis);  axisinds
array([0, 2, 2, 2, 1])

现在我如何通过沿着该轴获取索引元素来将数组减少1维?你知道吗

对于2D和axis=-1,可以这样做(为了获得示例数组中每行的绝对最大值):

>>> a[arange(len(axisinds)), axisinds]
array([ 0.49970414,  0.4263927 , -0.4647834 , -0.29381079,  0.15729681])

但这是非常特殊的,仅限于1或0个结果维度。 任何ndimaxis怎么办?你知道吗


Tags: 元素示例lenabs数组指数arrayaxis
1条回答
网友
1楼 · 发布于 2024-09-25 08:28:26

现在我自己找到了一个简单的解决办法:

def choose_axis(inds, a, axis=-1):
    return np.choose(inds, np.rollaxis(a, axis))

>>> choose_axis(axisinds, a, -1)
array([ 0.49970414,  0.4263927 , -0.4647834 , -0.29381079,  0.15729681])

编辑:但是这种方法被证明在轴方向上最多只能有31个元素(32位?)-因为np.choose的(未记录的)限制。在许多情况下,这是可以的。你知道吗

但这是一个

无限方法:

def choose_axis(inds, a, axis=-1):
    # handles any number & size of dimensions, and any axis
    if (axis + 1) % a.ndim:            # move axis to last dim
        a = np.moveaxis(a, axis, -1)   # = np.rollaxis(a, axis, a.ndim)
    shape = a.shape
    a = a.reshape(-1, shape[-1])   # 2D
    a = a[np.arange(inds.size), inds.ravel()]  # effective reduction
    return a.reshape(shape[:-1])

因此,ND absolute min示例可以如下所示:

def absminND(a, axis=-1):
    inds = a.__abs__().argmin(axis)
    if axis is None:
        return a.ravel()[inds]
    return choose_axis(inds, a)

相关问题 更多 >