numpy.take_along_axis #
- 麻木的。take_along_axis ( arr ,索引,轴) [来源] #
通过匹配一维索引和数据切片从输入数组中获取值。
这会迭代索引和数据数组中沿指定轴定向的匹配一维切片,并使用前者查找后者中的值。这些切片可以有不同的长度。
沿轴返回索引的函数(例如
argsort
和argpartition
)会为此函数生成合适的索引。1.15.0 版本中的新增功能。
- 参数:
- 返回:
- 输出:ndarray(Ni…,J,Nk…)
索引结果。
也可以看看
take
沿着轴,对每个 1d 切片使用相同的索引
put_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 out = np.empty(Ni + (J,) + Nk) for ii in ndindex(Ni): for kk in ndindex(Nk): a_1d = a [ii + s_[:,] + kk] indices_1d = indices[ii + s_[:,] + kk] out_1d = out [ii + s_[:,] + kk] for j in range(J): out_1d[j] = a_1d[indices_1d[j]]
同样,消除内部循环,最后两行将是:
out_1d[:] = a_1d[indices_1d]
例子
对于这个样本数组
>>> a = np.array([[10, 30, 20], [60, 40, 50]])
我们可以直接使用 sort 进行排序,也可以使用 argsort 和这个函数进行排序
>>> np.sort(a, axis=1) array([[10, 20, 30], [40, 50, 60]]) >>> ai = np.argsort(a, axis=1) >>> ai array([[0, 2, 1], [1, 2, 0]]) >>> np.take_along_axis(a, ai, axis=1) array([[10, 20, 30], [40, 50, 60]])
如果您使用以下方法维护平凡维度,则对于 max 和 min 也同样适用
keepdims
:>>> np.max(a, axis=1, keepdims=True) array([[30], [60]]) >>> ai = np.argmax(a, axis=1, keepdims=True) >>> ai array([[1], [0]]) >>> np.take_along_axis(a, ai, axis=1) array([[30], [60]])
如果我们想同时获得最大值和最小值,我们可以先将索引堆叠起来
>>> ai_min = np.argmin(a, axis=1, keepdims=True) >>> ai_max = np.argmax(a, axis=1, keepdims=True) >>> ai = np.concatenate([ai_min, ai_max], axis=1) >>> ai array([[0, 1], [1, 0]]) >>> np.take_along_axis(a, ai, axis=1) array([[10, 30], [40, 60]])