numpy.put_along_axis#

numpy.put_along_axis(arr, indices, values, axis)[源代码]#

通过匹配一维索引和数据切片将值放入目标数组中.

这会遍历在索引和数据数组中沿指定轴方向匹配的1维切片,并使用前者将值放入后者中.这些切片可以有不同的长度.

argsortargpartition 这样返回沿轴索引的函数,为这个函数生成合适的索引.

在 1.15.0 版本加入.

参数:
arrndarray (Ni…, M, Nk…)

目标数组.

indicesndarray (Ni…, J, Nk…)

沿 arr 的每个一维切片更改的索引.这必须与 arr 的维度匹配,但 Ni 和 Nj 中的维度可以是 1 以与 arr 进行广播.

valuesarray_like (Ni…, J, Nk…)

在这些索引处插入的值.其形状和维度会广播以匹配 indices 的形状和维度.

axisint

要沿其进行1d切片的方向.如果axis为None,则目标数组被视为如果已创建其扁平化1d视图.

参见

take_along_axis

通过匹配一维索引和数据切片从输入数组中取值

备注

这相当于(但比以下使用 ndindexs_ 更快),其中将 iikk 分别设置为索引元组:

Ni, M, Nk = a.shape[:axis], a.shape[axis], a.shape[axis+1:]
J = indices.shape[axis]  # Need not equal M

for ii in ndindex(Ni):
    for kk in ndindex(Nk):
        a_1d       = a      [ii + s_[:,] + kk]
        indices_1d = indices[ii + s_[:,] + kk]
        values_1d  = values [ii + s_[:,] + kk]
        for j in range(J):
            a_1d[indices_1d[j]] = values_1d[j]

等效地,消除内部循环,最后两行将是:

a_1d[indices_1d] = values_1d

示例

>>> import numpy as np

对于这个示例数组

>>> a = np.array([[10, 30, 20], [60, 40, 50]])

我们可以用以下内容替换最大值:

>>> ai = np.argmax(a, axis=1, keepdims=True)
>>> ai
array([[1],
       [0]])
>>> np.put_along_axis(a, ai, 99, axis=1)
>>> a
array([[10, 99, 20],
       [99, 40, 50]])