Python 不同大小数组(锯齿状数组)的集合,Dask?
Python collection of different sized arrays (Jagged arrays), Dask?
我有多个表示音频数据的不同大小的一维 numpy 数组。
由于它们的大小不同(例如 (8200,)
、(13246,)
、(61581,)
),我无法将它们作为 1 个数组与 numpy 堆叠。大小相差太大,搞0-padding
我可以将它们保存在列表或字典中,然后使用 for
循环遍历它们来进行计算,但我更愿意以 numpy 的方式处理它。在变量上调用 numpy 函数,而无需编写 for 循环。类似于:
np0 = np.array([.2, -.4, -.5])
np1 = np.array([-.8, .9])
np_mix = irregular_stack(np0, np1)
np.sum(np_mix)
# output: [-0.7, 0.09999999999999998]
看着这张Dask的图片,我在想我能不能用Dask做我想做的事。
我目前的尝试是这样的:
import numpy as np
import dask.array as da
np0 = np.array([.2, -.4, -.5])
arr0 = da.from_array(np0, chunks=(3,))
np1 = np.array([-.8, .9])
arr1 = da.from_array(np1, chunks=(2,))
# stack them
data = [[arr0],
[arr1]]
x = da.block(data)
x.compute()
# output: ValueError: ('Shapes do not align: %s', [(1, 3), (1, 2)])
问题
- 我是不是误解了 Dask 的使用方式?
- 如果可能,我该如何做我的
np.sum()
示例?
- 如果可能的话,它真的比高端单机上的 for 循环更快吗?
不幸的是,Dask 数组遵循 Numpy 语义,并假定所有行的长度相等。
我不知道 Python 中有什么好的库可以有效地处理今天参差不齐的数组,所以你可能运气不好。
我找到了库 awkward-array
(https://github.com/scikit-hep/awkward-array),它允许不同长度的数组并且可以执行我要求的操作:
import numpy as np
import awkward
np0 = np.array([.2, -.4, -.5])
np1 = np.array([-.8, .9])
varlen = awkward.fromiter([np0, np1])
# <JaggedArray [[0.2 -0.4 -0.5] [-0.8 0.9]] at 0x7f01a743e790>
varlen.sum()
# output: array([-0.7, 0.1])
图书馆自我描述为:"Manipulate arrays of complex data structures as easily as Numpy."
到目前为止,它似乎满足了我的一切需求。
我有多个表示音频数据的不同大小的一维 numpy 数组。
由于它们的大小不同(例如 (8200,)
、(13246,)
、(61581,)
),我无法将它们作为 1 个数组与 numpy 堆叠。大小相差太大,搞0-padding
我可以将它们保存在列表或字典中,然后使用 for
循环遍历它们来进行计算,但我更愿意以 numpy 的方式处理它。在变量上调用 numpy 函数,而无需编写 for 循环。类似于:
np0 = np.array([.2, -.4, -.5])
np1 = np.array([-.8, .9])
np_mix = irregular_stack(np0, np1)
np.sum(np_mix)
# output: [-0.7, 0.09999999999999998]
看着这张Dask的图片,我在想我能不能用Dask做我想做的事。
我目前的尝试是这样的:
import numpy as np
import dask.array as da
np0 = np.array([.2, -.4, -.5])
arr0 = da.from_array(np0, chunks=(3,))
np1 = np.array([-.8, .9])
arr1 = da.from_array(np1, chunks=(2,))
# stack them
data = [[arr0],
[arr1]]
x = da.block(data)
x.compute()
# output: ValueError: ('Shapes do not align: %s', [(1, 3), (1, 2)])
问题
- 我是不是误解了 Dask 的使用方式?
- 如果可能,我该如何做我的
np.sum()
示例? - 如果可能的话,它真的比高端单机上的 for 循环更快吗?
不幸的是,Dask 数组遵循 Numpy 语义,并假定所有行的长度相等。
我不知道 Python 中有什么好的库可以有效地处理今天参差不齐的数组,所以你可能运气不好。
我找到了库 awkward-array
(https://github.com/scikit-hep/awkward-array),它允许不同长度的数组并且可以执行我要求的操作:
import numpy as np
import awkward
np0 = np.array([.2, -.4, -.5])
np1 = np.array([-.8, .9])
varlen = awkward.fromiter([np0, np1])
# <JaggedArray [[0.2 -0.4 -0.5] [-0.8 0.9]] at 0x7f01a743e790>
varlen.sum()
# output: array([-0.7, 0.1])
图书馆自我描述为:"Manipulate arrays of complex data structures as easily as Numpy."
到目前为止,它似乎满足了我的一切需求。