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, 仅关键字参数
如果设置为
True,np.vectorize将应用于func以方便使用。默认为False。- allow_rechunk: 可选, bool, 仅关键字
允许重新分块,否则块大小需要匹配,核心维度只能由一个块组成。警告:启用此功能会显著增加内存使用。默认为
False。- meta: 可选, 元组, 仅关键字
描述 gufunc 输出形状和数据类型的空 ndarray 元组。默认为
None。- **kwargsdict
传递给 func 的额外关键字参数
- 返回
- 单个 dask.array.Array 或 dask.array.Array 的元组
参考文献
示例
>>> 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)