dask.array.apply_along_axis

dask.array.apply_along_axis

dask.array.apply_along_axis(func1d, axis, arr, *args, dtype=None, shape=None, **kwargs)[源代码]

沿给定轴对1-D切片应用函数。

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

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

这是通过 dask.array.map_blocks() 实现的 numpy.apply_along_axis() 的阻塞变体。

参数
func1d函数 (M,) -> (Nj…)

此函数应接受一维数组。它将应用于沿指定轴的 arr 的一维切片。

整数

沿其对 arr 进行切片的轴。

arrndarray (Ni…, M, Nk…)

输入数组。

参数任何

func1d 的额外参数。

kwargs任何

func1d 的附加命名参数。

1.9.0 新版功能.

返回
ndarray (Ni…, Nj…, Nk…)

输出数组。out 的形状与 arr 的形状相同,除了沿 axis 维度。该轴被移除,并替换为与 func1d 返回值形状相等的新维度。因此,如果 func1d 返回一个标量,out 将比 arr 少一个维度。

参见

apply_over_axes

在多个轴上重复应用函数。

注释

如果 dtypeshape 没有提供,Dask 会尝试通过在虚拟数组上调用 func1d 来确定它们。这可能会为 dtypeshape 产生不正确的值,因此我们建议提供它们。

执行 func1d(a, *args, **kwargs) 其中 func1d 对 1-D 数组进行操作,而 a 是沿 axisarr 进行 1-D 切片的结果。

这等同于(但比以下使用 ndindexs_ 更快),它将 iijjkk 分别设置为一个索引元组:

Ni, Nk = a.shape[:axis], a.shape[axis+1:]
for ii in ndindex(Ni):
    for kk in ndindex(Nk):
        f = func1d(arr[ii + s_[:,] + kk])
        Nj = f.shape
        for jj in ndindex(Nj):
            out[ii + jj + kk] = f[jj]

同样地,消除内部循环,这可以表示为:

Ni, Nk = a.shape[:axis], a.shape[axis+1:]
for ii in ndindex(Ni):
    for kk in ndindex(Nk):
        out[ii + s_[...,] + kk] = func1d(arr[ii + s_[:,] + kk])

示例

>>> import numpy as np  
>>> def my_func(a):  
...     """Average first and last element of a 1-D array"""
...     return (a[0] + a[-1]) * 0.5
>>> b = np.array([[1,2,3], [4,5,6], [7,8,9]])  
>>> np.apply_along_axis(my_func, 0, b)  
array([4., 5., 6.])
>>> np.apply_along_axis(my_func, 1, b)  
array([2.,  5.,  8.])

对于返回一维数组的函数,outarr 的维度数与 arr 相同。

>>> b = np.array([[8,1,7], [4,3,9], [5,2,6]])  
>>> np.apply_along_axis(sorted, 1, b)  
array([[1, 7, 8],
       [3, 4, 9],
       [2, 5, 6]])

对于返回高维数组的函数,这些维度将插入到 axis 维度所在的位置。

>>> b = np.array([[1,2,3], [4,5,6], [7,8,9]])  
>>> np.apply_along_axis(np.diag, -1, b)  
array([[[1, 0, 0],
        [0, 2, 0],
        [0, 0, 3]],
       [[4, 0, 0],
        [0, 5, 0],
        [0, 0, 6]],
       [[7, 0, 0],
        [0, 8, 0],
        [0, 0, 9]]])