Dask 数组

Python 中的 Dask 并行编程

James Fulton

Climate informatics researcher

数组分块

显示将数组视为一个整体

Python 中的 Dask 并行编程

数组分块

显示将数组切分为多个块

Python 中的 Dask 并行编程

NumPy vs. Dask 数组

显示将数组视为一个整体

import numpy as np

x = np.ones((4000, 6000))
print(x.sum())
24000000.0
  • 运行耗时 740 毫秒

显示将数组切分为多个块

import dask.array as da

x = da.ones((4000, 6000), chunks=(1000,2000))
print(x.sum().compute())
24000000.0
  • 运行耗时 60 毫秒
Python 中的 Dask 并行编程

Dask 数组任务图

展示任务图的分支如何汇合得到最终结果。

Python 中的 Dask 并行编程

Dask 数组方法

Dask 数组几乎拥有 NumPy 数组的所有方法。

  • x.max()
  • x.min()
  • x.sum()
  • x.mean()
  • 等等。
print(sum_down_columns.compute())
array([1000., 1000., 1000., 1000., 
    1000., 1000., 1000., 1000., 1000.,
    1000.])
Python 中的 Dask 并行编程

像使用 NumPy 一样使用 Dask 数组

# 用 Dask 数组进行惰性计算
y1 = x**2 + 2*x + 1

# 惰性切片
y2 = x[:10]

# 调用 NumPy 函数同样是惰性的
y3 = np.sin(x)
print(y1)
dask.array<add, shape=(1000, 10), ...
print(y2)
dask.array<getitem, shape=(10, 10), ...
print(y3)
dask.array<sin, shape=(1000, 10), ...
Python 中的 Dask 并行编程

加载图像数组

import dask.array as da

import da.image
image_array = da.image.imread('images/*.png')
print(image_array)
dask.array<imread, shape=(40000, 256, 256, 3), dtype=uint8, 
    chunksize=(1, 256, 256, 3), chunktype=numpy.ndarray>
Python 中的 Dask 并行编程

对分块应用自定义函数

def instagram_filter(image):
    ...
    return pretty_image

# 将函数独立应用于每张图像 pretty_image_array = image_array.map_blocks(instagram_filter)
print(pretty_image_array)
dask.array<instagram_filter, shape=(40000, 256, 256, 3), dtype=uint8, 
    chunksize=(1, 256, 256, 3), chunktype=numpy.ndarray>
Python 中的 Dask 并行编程

Vamos praticar!

Python 中的 Dask 并行编程

Preparing Video For Download...