dask.array.take

dask.array.take

dask.array.take(a, indices, axis=0)[源代码]

沿轴从数组中提取元素。

此文档字符串是从 numpy.take 复制的。

Dask 版本可能存在一些不一致性。

当 axis 不是 None 时,此函数与“花式”索引(使用数组索引数组)做同样的事情;然而,如果你需要沿给定轴的元素,使用它可能会更容易。例如,np.take(arr, indices, axis=3) 等价于 arr[:,:,:,indices,...]

在不使用复杂索引的情况下解释,这等同于以下使用 ndindex 的方式,它将 iijjkk 分别设置为索引的元组:

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]
参数
aarray_like (Ni…, M, Nk…)

源数组。

索引array_like (Nj…)

要提取的值的索引。

1.8.0 新版功能.

也允许标量作为索引。

int, 可选

要选择值的轴。默认情况下,使用展平的输入数组。

ndarray, 可选 (Ni…, Nj…, Nk…)

如果提供,结果将被放置在这个数组中。它应该具有适当的形状和数据类型。注意,如果 mode=’raise’out 总是被缓冲的;使用其他模式以获得更好的性能。

模式{‘raise’, ‘wrap’, ‘clip’}, 可选 (Dask 中不支持)

指定越界索引的行为方式。

  • ‘raise’ – 引发错误(默认)

  • ‘wrap’ – 环绕

  • ‘clip’ – 裁剪到范围

‘clip’ 模式意味着所有过大的索引都被替换为沿该轴指向最后一个元素的索引。请注意,这会禁用使用负数进行索引。

返回
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)

示例

>>> import numpy as np  
>>> 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]])