numpy.put_along_axis#
- numpy.put_along_axis(arr, indices, values, axis)[源代码]#
通过匹配一维索引和数据切片将值放入目标数组。
此函数会迭代索引数组和数据数组中沿指定轴对齐的匹配一维切片,并使用前者在后者中放置值。这些切片可以具有不同的长度。
返回沿轴索引的函数,例如
argsort和argpartition,可以为该函数生成合适的索引。- 参数:
- arrndarray (Ni…, M, Nk…)
目标数组。
- indicesndarray (Ni…, J, Nk…)
arr 的每个一维切片上的更改索引。此参数必须与 arr 的维度匹配,但 Ni 和 Nj 中的维度可以为 1 以便对 arr 进行广播。
- valuesarray_like (Ni…, J, Nk…)
要插入到这些索引的值。其形状和维度会广播以匹配
indices。- axisint
沿哪个轴获取一维切片。如果 axis 为 None,则目标数组将被视为已创建了其扁平化的一维视图。
另请参阅
take_along_axis通过匹配一维索引和数据切片从输入数组中获取值
备注
这等效于(但比)以下使用
ndindex和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
示例
>>> 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]])