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,)))