dask.array.from_array

dask.array.from_array

dask.array.from_array(x, chunks='auto', name=None, lock=False, asarray=None, fancy=True, getitem=None, meta=None, inline_array=False)[源代码]

从看起来像数组的对象创建 dask 数组。

输入必须具有 .shape.ndim.dtype ,并支持 numpy 风格的切片。

参数
xarray_like
int, 元组

如何对数组进行分块。必须是以下形式之一:

  • 一个像 1000 这样的块大小。

  • 一个类似 (1000, 1000) 的块形状。

  • 所有维度上所有块的显式大小,例如 ((1000, 1000, 500), (400, 400))。

  • 字节大小,如“100 MiB”,这将选择一个均匀的块状形状

  • 单词 “auto” 的作用类似于上述,但它使用配置值 array.chunk-size 作为块大小

-1 或 None 作为 blocksize 表示相应维度的大小。

名称str 或 bool, 可选

用于数组的键名。默认为 x 的哈希值。

哈希在多次使用相同的 x 值创建多个数组时非常有用,因为 Dask 可以识别它们是相同的并避免重复计算。然而,哈希也可能很慢,并且如果数组不是连续的,它会被复制以进行哈希处理。如果数组使用步幅技巧(如 numpy.broadcast_to()skimage.util.view_as_windows())来拥有比物理大小更大的逻辑大小,这种复制可能会导致内存使用过度。

如果你不需要哈希提供的去重功能,可以使用 name=False 来生成一个随机名称,而不是进行哈希,这样可以避免上述陷阱。使用 name=True 等同于默认设置。

默认情况下,哈希使用 Python 的标准 sha1。这种行为可以通过安装 cityhash、xxhash 或 murmurhash 来改变。如果安装了这些库,可以在分词步骤中获得较大的加速效果。

备注

因为此 name 被用作任务图中的键,你应该确保它唯一标识包含的数据。如果你想提供一个描述性名称但仍保持唯一性,可以将描述性名称与 dask.base.tokenize()array_like 结合。更多信息请参见 任务图

布尔值或锁, 可选

如果 x 不支持并发读取,那么请在此处提供一个锁,或者传入 True 让 dask.array 为你创建一个。

asarraybool, 可选

如果为 True,则对块调用 np.asarray 以将其转换为 numpy 数组。如果为 False,则块保持不变。如果为 None(默认),则在 __array_function__ 方法未定义时使用 True。

备注

当使用Fortran而非C顺序创建数组时,Dask不会保留原始数组的内存布局。

花哨bool, 可选

如果 x 不支持花式索引(例如使用列表或数组进行索引),则设置为 False。默认为 True。

meta类似数组,可选

生成的dask数组的元数据。这是从输入数组切片后将得到的数组类型。默认为输入数组。

inline_arraybool, 默认 False

如何在任务图中包含数组。默认情况下(inline_array=False),数组本身包含在一个任务中,每个块通过其键引用该任务。

>>> x = h5py.File("data.h5")["/x"]  
>>> a = da.from_array(x, chunks=500)  
>>> dict(a.dask)  
{
   'array-original-<name>': <HDF5 dataset ...>,
   ('array-<name>', 0): (getitem, "array-original-<name>", ...),
   ('array-<name>', 1): (getitem, "array-original-<name>", ...)
}

使用 inline_array=True,Dask 将直接在任务图的值中内联数组。

>>> a = da.from_array(x, chunks=500, inline_array=True)  
>>> dict(a.dask)  
{
   ('array-<name>', 0): (getitem, <HDF5 dataset ...>, ...),
   ('array-<name>', 1): (getitem, <HDF5 dataset ...>, ...)
}

注意,任务图中不再有仅包含数组 x 的键。相反,它直接放置在值中。

选择 inline_array 的正确方式取决于多个因素,包括 x 的大小、创建的代价、你使用的调度器以及下游计算的模式。作为一种启发式方法,当数组 x 的序列化和反序列化成本较低(因为它在图中被多次包含)并且如果你遇到排序问题时(更多信息请参见 排序),inline_array=True 可能是正确的选择。

x 是 NumPy 数组时,这没有效果。

示例

>>> x = h5py.File('...')['/data/path']  
>>> a = da.from_array(x, chunks=(1000, 1000))  

如果你的底层数据存储不支持并发读取,那么请包含 lock=True 关键字参数,或者如果你想让多个数组围绕同一个锁进行协调,可以使用 lock=mylock

>>> a = da.from_array(x, chunks=(1000, 1000), lock=True)  

如果你的底层数据存储有一个 .chunks 属性(如 h5py 和 zarr 数据集所具有的),那么如果你不提供块形状,将会使用该块形状的倍数。

>>> a = da.from_array(x, chunks='auto')  
>>> a = da.from_array(x, chunks='100 MiB')  
>>> a = da.from_array(x)  

如果提供名称,请确保它是唯一的

>>> import dask.base
>>> token = dask.base.tokenize(x)  
>>> a = da.from_array('myarray-' + token)  

NumPy ndarrays 被立即切片并嵌入图中。

>>> import dask.array
>>> a = dask.array.from_array(np.array([[1, 2], [3, 4]]), chunks=(1,1))
>>> a.dask[a.name, 0, 0][0]
array([1])

可以创建具有精确指定、不同大小的块。

>>> import numpy as np
>>> import dask.array as da
>>> rng = np.random.default_rng()
>>> x = rng.random((100, 6))
>>> a = da.from_array(x, chunks=((67, 33), (6,)))