作业

作业

Dask Array 支持大部分 NumPy 赋值索引语法。特别是,它支持以下各项的组合:

  • 通过整数索引:x[1] = y

  • 通过切片索引:x[2::-1] = y

  • 通过整数列表进行索引:x[[0, -1, 1]] = y

  • 通过一个一维的 numpy 整数数组进行索引:x[np.arange(3)] = y

  • 通过一维 Array 的整数进行索引:x[da.arange(3)] = y, x[da.from_array([0, -1, 1])] = y, x[da.where(np.array([1, 2, 3]) < 3)[0]] = y

  • 通过布尔列表索引:x[[False, True, True]] = y

  • 通过一个布尔类型的 1-d numpy 数组进行索引:x[np.arange(3) > 0] = y

它还支持:

  • 通过一个可广播的布尔值 Array 进行索引:x[x > 0] = y

然而,它目前不支持以下内容:

  • 在多个轴上使用列表进行索引:x[[1, 2, 3], [3, 1, 2]] = y

广播

正常的 NumPy 广播规则适用:

>>> x = da.zeros((2, 6))
>>> x[0] = 1
>>> x[..., 1] = 2.0
>>> x[:, 2] = [3, 4]
>>> x[:, 5:2:-2] = [[6, 5]]
>>> x.compute()
array([[1., 2., 3., 5., 1., 6.],
       [0., 2., 4., 5., 0., 6.]])
>>> x[1] = -x[0]
>>> x.compute()
array([[ 1.,  2.,  3.,  5.,  1.,  6.],
       [-1., -2., -3., -5., -1., -6.]])

遮罩

元素可以通过赋值给 NumPy 的掩码值,或者赋值给一个包含掩码值的数组来进行掩码处理:

>>> x = da.ones((2, 6))
>>> x[0, [1, -2]] = np.ma.masked
>>> x[1] = np.ma.array([0, 1, 2, 3, 4, 5], mask=[0, 1, 1, 0, 0, 0])
>>> print(x.compute())
[[1.0 -- 1.0 1.0 -- 1.0]
 [0.0 -- -- 3.0 4.0 5.0]]
>>> x[:, 0] = x[:, 1]
>>> print(x.compute())
[[1.0 -- 1.0 1.0 -- 1.0]
 [0.0 -- -- 3.0 4.0 5.0]]
>>> x[:, 0] = x[:, 1]
>>> print(x.compute())
[[-- -- 1.0 1.0 -- 1.0]
 [-- -- -- 3.0 4.0 5.0]]

如果,且仅当,提供了一个可广播的布尔值 Array,那么掩码数组赋值目前还不能按预期工作。在这种情况下,掩码下的数据会被赋值:

>>> x = da.arange(12).reshape(2, 6)
>>> x[x > 7] = np.ma.array(-99, mask=True)
>>> print(x.compute())
[[  0   1   2   3   4   5]
 [  6   7 -99 -99 -99 -99]]

请注意,当布尔值 Array 索引用于索引元组或隐式元组时,掩码赋值确实有效:

>>> x = da.arange(12).reshape(2, 6)
>>> x[1, x[0] > 3] = np.ma.masked
>>> print(x.compute())
[[0 1 2 3 4 5]
 [6 7 8 9 -- --]]
>>> x = da.arange(12).reshape(2, 6)
>>> print(x.compute())
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]]
>>> x[(x[:, 2] < 4,)] = np.ma.masked
>>> print(x.compute())
[[-- -- -- -- -- --]
 [6 7 8 9 10 11]]