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