numpy.put_along_axis #
- 麻木的。put_along_axis ( arr ,索引,值,轴) [来源] #
通过匹配一维索引和数据切片将值放入目标数组中。
这会迭代索引和数据数组中沿指定轴定向的匹配一维切片,并使用前者将值放入后者中。这些切片可以有不同的长度。
沿轴返回索引的函数(例如
argsort
和argpartition
)会为此函数生成合适的索引。1.15.0 版本中的新增功能。
- 参数:
- arr ndarray (Ni…, M, Nk…)
目标数组。
- 索引ndarray (Ni…, J, Nk…)
沿着arr的每个 1d 切片更改的索引。这必须与 arr 的维度匹配,但 Ni 和 Nj 中的维度可以为 1 以针对arr进行广播。
- 值array_like (Ni…, J, Nk…)
要在这些索引处插入的值。它的形状和尺寸被广播以匹配 的形状和尺寸
indices
。- 轴整数
沿 1d 切片的轴。如果 axis 为 None,则将目标数组视为已为其创建了展平的一维视图。
也可以看看
take_along_axis
通过匹配一维索引和数据切片从输入数组中获取值
笔记
这相当于(但比)以下使用
ndindex
and 更快s_
,它将每个ii
和设置kk
为一个索引元组: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
例子
对于这个样本数组
>>> 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]])