【问题标题】:Python collection of different sized arrays (Jagged arrays), Dask?不同大小数组(锯齿状数组)的 Python 集合,Dask?
【发布时间】:2019-11-18 10:08:50
【问题描述】:

我有多个表示音频数据的不同大小的一维 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)])

问题

  1. 我是否误解了 Dask 的使用方式?
  2. 如果可能,我该如何做我的np.sum() 示例?
  3. 如果可能的话,它实际上是否比高端单台 PC 上的 for 循环更快?

【问题讨论】:

    标签: arrays python-3.x numpy dask awkward-array


    【解决方案1】:

    我找到了库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])
    

    该库将自己描述为:“像 Numpy 一样轻松地操作复杂数据结构的数组。”

    到目前为止,它似乎满足了我所需要的一切。

    【讨论】:

      【解决方案2】:

      不幸的是,Dask 数组遵循 Numpy 语义,并假设所有行的长度相等。

      我不知道今天有什么好的 Python 库可以有效地处理不规则数组,所以你可能不走运。

      【讨论】:

      猜你喜欢
      • 2015-09-23
      • 1970-01-01
      • 2020-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-21
      • 2015-07-01
      相关资源
      最近更新 更多