dask 数组上的数组操作
Array operations on dask arrays
我有两个 dask 数组,即 a 和 b。我得到 a 和 b 的点积如下
>>>z2 = da.from_array(a.dot(b),chunks=1)
>>> z2
dask.array<from-ar..., shape=(3, 3), dtype=int32, chunksize=(1, 1)>
但是当我这样做时
sigmoid(z2)
Shell 停止工作。我什至不能杀死它。
Sigmoid 给出如下:
def sigmoid(z):
return 1/(1+np.exp(-z))
知道了...我试过了,成功了!
ans = z2.map_blocks(sigmoid)
使用 Dask 数组时,通常最好使用 dask.array
中提供的函数。直接使用 NumPy 函数的问题是它们会将数据从 Dask 数组提取到内存中,这可能是您遇到的 shell 冻结的原因。 dask.array
中提供的函数旨在通过延迟链接计算来避免这种情况,直到您希望对它们进行评估。在这种情况下,最好使用 da.exp
而不是 np.exp
。下面提供了一个例子。
已提供您的代码的修改版本以演示如何完成此操作。在我调用 .compute()
的示例中,它也将完整结果拉入内存。如果您的数据非常大,这也可能会给您带来问题。因此,我已经演示了在调用计算之前获取一小部分数据以保持结果小和内存友好。如果您的数据很大并且您希望保留完整的结果,建议将其存储到磁盘。
希望这对您有所帮助。
In [1]: import dask.array as da
In [2]: def sigmoid(z):
...: return 1 / (1 + da.exp(-z))
...:
In [3]: d = da.random.uniform(-6, 6, (100, 110), chunks=(10, 11))
In [4]: ds = sigmoid(d)
In [5]: ds[:5, :6].compute()
Out[5]:
array([[ 0.0067856 , 0.31701817, 0.43301395, 0.23188129, 0.01530903,
0.34420555],
[ 0.24473798, 0.99594466, 0.9942868 , 0.9947099 , 0.98266004,
0.99717379],
[ 0.92617922, 0.17548207, 0.98363658, 0.01764361, 0.74843615,
0.04628735],
[ 0.99155315, 0.99447542, 0.99483032, 0.00380505, 0.0435369 ,
0.01208241],
[ 0.99640952, 0.99703901, 0.69332886, 0.97541982, 0.05356214,
0.1869447 ]])
我有两个 dask 数组,即 a 和 b。我得到 a 和 b 的点积如下
>>>z2 = da.from_array(a.dot(b),chunks=1)
>>> z2
dask.array<from-ar..., shape=(3, 3), dtype=int32, chunksize=(1, 1)>
但是当我这样做时
sigmoid(z2)
Shell 停止工作。我什至不能杀死它。 Sigmoid 给出如下:
def sigmoid(z):
return 1/(1+np.exp(-z))
知道了...我试过了,成功了!
ans = z2.map_blocks(sigmoid)
使用 Dask 数组时,通常最好使用 dask.array
中提供的函数。直接使用 NumPy 函数的问题是它们会将数据从 Dask 数组提取到内存中,这可能是您遇到的 shell 冻结的原因。 dask.array
中提供的函数旨在通过延迟链接计算来避免这种情况,直到您希望对它们进行评估。在这种情况下,最好使用 da.exp
而不是 np.exp
。下面提供了一个例子。
已提供您的代码的修改版本以演示如何完成此操作。在我调用 .compute()
的示例中,它也将完整结果拉入内存。如果您的数据非常大,这也可能会给您带来问题。因此,我已经演示了在调用计算之前获取一小部分数据以保持结果小和内存友好。如果您的数据很大并且您希望保留完整的结果,建议将其存储到磁盘。
希望这对您有所帮助。
In [1]: import dask.array as da
In [2]: def sigmoid(z):
...: return 1 / (1 + da.exp(-z))
...:
In [3]: d = da.random.uniform(-6, 6, (100, 110), chunks=(10, 11))
In [4]: ds = sigmoid(d)
In [5]: ds[:5, :6].compute()
Out[5]:
array([[ 0.0067856 , 0.31701817, 0.43301395, 0.23188129, 0.01530903,
0.34420555],
[ 0.24473798, 0.99594466, 0.9942868 , 0.9947099 , 0.98266004,
0.99717379],
[ 0.92617922, 0.17548207, 0.98363658, 0.01764361, 0.74843615,
0.04628735],
[ 0.99155315, 0.99447542, 0.99483032, 0.00380505, 0.0435369 ,
0.01208241],
[ 0.99640952, 0.99703901, 0.69332886, 0.97541982, 0.05356214,
0.1869447 ]])