dask.array.gufunc.apply_gufunc

dask.array.gufunc.apply_gufunc

dask.array.gufunc.apply_gufunc(func, signature, *args, axes=None, axis=None, keepdims=False, output_dtypes=None, output_sizes=None, vectorize=None, allow_rechunk=False, meta=None, **kwargs)[源代码]

将广义ufunc或类似的Python函数应用于数组。

signature 决定了函数是消耗还是产生核心维度。给定输入数组 (*args) 中的剩余维度被视为循环维度,并且需要自然地相互广播。

换句话说,这个函数类似于 np.vectorize ,但适用于 dask 数组的块。如果函数本身也需要向量化,请使用 vectorize=True 以方便操作。

参数
函数可调用

在输入数组(*args)上调用类似于 func(*args, **kwargs) 的函数,返回一个数组或数组元组。如果提供了多个维度不匹配的参数,期望该函数以 NumPy 通用函数 [1] 的风格对位置参数的轴进行矢量化(广播)(如果不是这种情况,请设置 vectorize=True)。如果此函数返回多个输出,则必须设置 output_core_dims

签名: 字符串

指定 func 消耗和产生的核心维度。根据 numpy.gufunc 签名的规范 [2]

*args数字

将输入数组或标量传递给可调用函数。

axes: 元组列表, 可选, 仅关键字参数

一个元组列表,包含广义ufunc应操作的轴的索引。例如,对于矩阵乘法的签名 "(i,j),(j,k)->(i,k)",基本元素是二维矩阵,并且这些矩阵被认为是存储在每个参数的最后两个轴中。相应的axes关键字将是 [(-2, -1), (-2, -1), (-2, -1)]。为简单起见,对于操作一维数组(向量)的广义ufuncs,可以接受单个整数而不是单元素元组,并且对于所有输出都是标量的广义ufuncs,可以省略输出元组。

轴: int, 可选, 仅关键字

一个泛型ufunc应操作的单个轴。这是对那些在单个共享核心维度上操作的ufunc的快捷方式,等同于为每个单核心维度参数传递包含(axis,)的轴,并为所有其他参数传递``()``。例如,对于签名``”(i),(i)->()”,它等同于传递``axes=[(axis,), (axis,), ()]

keepdims: bool, 可选, 仅关键字参数

如果设置为 True,被缩减的轴将作为大小为一的维度保留在结果中,以便结果能正确地与输入进行广播。此选项只能用于对所有输入具有相同核心维度的广义 ufuncs,并且输出没有核心维度,即签名类似于 "(i),(i)->()""(m,m)->()"。如果使用,可以通过 axes 和 axis 控制输出中维度的位置。

输出数据类型可选,dtype 或 dtypes 列表,仅关键字参数

有效的 numpy dtype 规范或其列表。如果未提供,则会对 func 进行少量数据的调用,以尝试自动确定输出 dtypes。

输出尺寸dict, 可选, 仅限关键字

可选的从维度名称到输出大小的映射。仅在输出中出现新的核心维度(在输入中未找到)时使用。

vectorize: bool, 仅关键字参数

如果设置为 Truenp.vectorize 将应用于 func 以方便使用。默认为 False

allow_rechunk: 可选, bool, 仅关键字

允许重新分块,否则块大小需要匹配,核心维度只能由一个块组成。警告:启用此功能会显著增加内存使用。默认为 False

meta: 可选, 元组, 仅关键字

描述 gufunc 输出形状和数据类型的空 ndarray 元组。默认为 None

**kwargsdict

传递给 func 的额外关键字参数

返回
单个 dask.array.Array 或 dask.array.Array 的元组

参考文献

1

https://docs.scipy.org/doc/numpy/reference/ufuncs.html

2

https://docs.scipy.org/doc/numpy/reference/c-api/generalized-ufuncs.html

示例

>>> import dask.array as da
>>> import numpy as np
>>> def stats(x):
...     return np.mean(x, axis=-1), np.std(x, axis=-1)
>>> a = da.random.normal(size=(10,20,30), chunks=(5, 10, 30))
>>> mean, std = da.apply_gufunc(stats, "(i)->(),()", a)
>>> mean.compute().shape
(10, 20)
>>> def outer_product(x, y):
...     return np.einsum("i,j->ij", x, y)
>>> a = da.random.normal(size=(   20,30), chunks=(10, 30))
>>> b = da.random.normal(size=(10, 1,40), chunks=(5, 1, 40))
>>> c = da.apply_gufunc(outer_product, "(i),(j)->(i,j)", a, b, vectorize=True)
>>> c.compute().shape
(10, 20, 30, 40)