dask.array.gufunc.gufunc

dask.array.gufunc.gufunc

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

在调用时将 pyfunc 绑定到 dask.array.apply_gufunc

参数
pyfunc可调用

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

签名字符串,仅限关键字

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

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

返回
包装函数

参考文献

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
>>> a = da.random.normal(size=(10,20,30), chunks=(5, 10, 30))
>>> def stats(x):
...     return np.mean(x, axis=-1), np.std(x, axis=-1)
>>> gustats = da.gufunc(stats, signature="(i)->(),()", output_dtypes=(float, float))
>>> mean, std = gustats(a)
>>> mean.compute().shape
(10, 20)
>>> a = da.random.normal(size=(   20,30), chunks=(10, 30))
>>> b = da.random.normal(size=(10, 1,40), chunks=(5, 1, 40))
>>> def outer_product(x, y):
...     return np.einsum("i,j->ij", x, y)
>>> guouter_product = da.gufunc(outer_product, signature="(i),(j)->(i,j)", output_dtypes=float, vectorize=True)
>>> c = guouter_product(a, b)
>>> c.compute().shape
(10, 20, 30, 40)
>>> a = da.ones((1, 5, 10), chunks=(-1, -1, -1))
>>> def stats(x):
...     return np.atleast_1d(x.mean()), np.atleast_1d(x.max())
>>> meta = (np.array((), dtype=np.float64), np.array((), dtype=np.float64))
>>> gustats = da.gufunc(stats, signature="(i,j)->(),()", meta=meta)
>>> result = gustats(a)
>>> result[0].compute().shape
(1,)
>>> result[1].compute().shape
(1,)
__init__(pyfunc, *, signature=None, vectorize=False, axes=None, axis=None, keepdims=False, output_sizes=None, output_dtypes=None, allow_rechunk=False, meta=None)[源代码]

方法

__init__(pyfunc, *[, signature, vectorize, ...])