numpy.take #
- 麻木的。take ( a , Index , axis = None , out = None , mode = 'raise' ) [来源] #
沿轴从数组中取出元素。
当 axis 不为 None 时,此函数执行与“花式”索引相同的操作(使用数组索引数组);但是,如果您需要沿给定轴的元素,它会更容易使用。诸如 之类的调用 相当于 .
np.take(arr, indices, axis=3)
arr[:,:,:,indices,...]
在没有花哨的索引的情况下进行解释,这相当于以下使用,它将、和
ndindex
中的每一个设置为索引元组:ii
jj
kk
Ni, Nk = a.shape[:axis], a.shape[axis+1:] Nj = indices.shape for ii in ndindex(Ni): for jj in ndindex(Nj): for kk in ndindex(Nk): out[ii + jj + kk] = a[ii + (indices[jj],) + kk]
- 参数:
- array_like (Ni…, M, Nk…)
源数组。
- 索引array_like (Nj...)
要提取的值的索引。
1.8.0 版本中的新增功能。
还允许索引标量。
- 轴int,可选
用于选择值的轴。默认情况下,使用展平的输入数组。
- 输出ndarray,可选(Ni…、Nj…、Nk…)
如果提供,结果将放置在该数组中。它应该具有适当的形状和类型。请注意,如果mode='raise' ,则out始终被缓冲;使用其他模式以获得更好的性能。
- 模式{'raise', 'wrap', 'clip'}, 可选
指定越界索引的行为方式。
'raise' – 引发错误(默认)
'wrap' – 环绕
'clip' – 剪辑到范围
“clip”模式意味着所有太大的索引都将被替换为沿该轴寻址最后一个元素的索引。请注意,这会禁用负数索引。
- 返回:
- out ndarray (Ni…, Nj…, Nk…)
返回的数组与a具有相同的类型。
也可以看看
compress
使用布尔掩码获取元素
ndarray.take
等效方法
take_along_axis
通过匹配数组和索引数组来获取元素
笔记
通过消除上面描述中的内部循环,并使用
s_
构建简单的切片对象,take
可以用对每个一维切片应用花式索引来表示:Ni, Nk = a.shape[:axis], a.shape[axis+1:] for ii in ndindex(Ni): for kk in ndindex(Nj): out[ii + s_[...,] + kk] = a[ii + s_[:,] + kk][indices]
因此,它相当于(但比)以下使用
apply_along_axis
:out = np.apply_along_axis(lambda a_1d: a_1d[indices], axis, a)
例子
>>> a = [4, 3, 5, 7, 6, 8] >>> indices = [0, 1, 4] >>> np.take(a, indices) array([4, 3, 6])
在此示例中,如果a是 ndarray,则可以使用“花式”索引。
>>> a = np.array(a) >>> a[indices] array([4, 3, 6])
如果
indices
不是一维,则输出也具有这些维度。>>> np.take(a, [[0, 1], [2, 3]]) array([[4, 3], [5, 7]])