代码之家  ›  专栏  ›  技术社区  ›  W.P. McNeill

Dask array mean抛出“setting an array element with a sequence”异常,其中pandas array mean起作用

  •  0
  • W.P. McNeill  · 技术社区  · 6 年前

    我有一个由一列numpy数组组成的pandas数据帧。我可以使用 numpy.mean

    import numpy
    import pandas
    f = pandas.DataFrame({"a":[numpy.array([1.0, 2.0]), numpy.array([3.0, 4.0])]})
    numpy.mean(f["a"]) # returns array([2., 3.])
    

    我也想在达斯克做同样的事。

    import dask.dataframe
    import dask.array
    g = dask.dataframe.from_pandas(f, npartitions=1)
    dask.array.mean(g["a"], dtype="float64")
    

    (您必须指定 dtype ,否则你会得到 TypeError: unsupported operand type(s) for /: 'NoneType' and 'int' 例外情况。)

    dask.array.mean 返回以下看起来正确的值。

    dask.array<mean_agg-aggregate, shape=(), dtype=float64, chunksize=(), chunktype=numpy.ndarray>
    

    但是,当我跑的时候 dask.array.mean(g["a"], dtype="float64").compute() 为了得到最终值,我得到一个 ValueError: setting an array element with a sequence. 例外。完整堆栈如下所示。

    Traceback (most recent call last):
      File "/Applications/PyCharm.app/Contents/plugins/python/helpers/pydev/_pydevd_bundle/pydevd_exec2.py", line 3, in Exec
        exec(exp, global_vars, local_vars)
      File "<input>", line 1, in <module>
      File "/Users/wmcneill/src.private/radius_limit/venv/lib/python3.7/site-packages/dask/base.py", line 165, in compute
        (result,) = compute(self, traverse=False, **kwargs)
      File "/Users/wmcneill/src.private/radius_limit/venv/lib/python3.7/site-packages/dask/base.py", line 436, in compute
        results = schedule(dsk, keys, **kwargs)
      File "/Users/wmcneill/src.private/radius_limit/venv/lib/python3.7/site-packages/dask/threaded.py", line 81, in get
        **kwargs
      File "/Users/wmcneill/src.private/radius_limit/venv/lib/python3.7/site-packages/dask/local.py", line 486, in get_async
        raise_exception(exc, tb)
      File "/Users/wmcneill/src.private/radius_limit/venv/lib/python3.7/site-packages/dask/local.py", line 316, in reraise
        raise exc
      File "/Users/wmcneill/src.private/radius_limit/venv/lib/python3.7/site-packages/dask/local.py", line 222, in execute_task
        result = _execute_task(task, data)
      File "/Users/wmcneill/src.private/radius_limit/venv/lib/python3.7/site-packages/dask/core.py", line 118, in _execute_task
        args2 = [_execute_task(a, cache) for a in args]
      File "/Users/wmcneill/src.private/radius_limit/venv/lib/python3.7/site-packages/dask/core.py", line 118, in <listcomp>
        args2 = [_execute_task(a, cache) for a in args]
      File "/Users/wmcneill/src.private/radius_limit/venv/lib/python3.7/site-packages/dask/core.py", line 119, in _execute_task
        return func(*args2)
      File "/Users/wmcneill/src.private/radius_limit/venv/lib/python3.7/site-packages/dask/optimization.py", line 982, in __call__
        return core.get(self.dsk, self.outkey, dict(zip(self.inkeys, args)))
      File "/Users/wmcneill/src.private/radius_limit/venv/lib/python3.7/site-packages/dask/core.py", line 149, in get
        result = _execute_task(task, cache)
      File "/Users/wmcneill/src.private/radius_limit/venv/lib/python3.7/site-packages/dask/core.py", line 119, in _execute_task
        return func(*args2)
      File "/Users/wmcneill/src.private/radius_limit/venv/lib/python3.7/site-packages/dask/utils.py", line 29, in apply
        return func(*args, **kwargs)
      File "/Users/wmcneill/src.private/radius_limit/venv/lib/python3.7/site-packages/dask/array/reductions.py", line 539, in mean_chunk
        total = sum(x, dtype=dtype, **kwargs)
      File "<__array_function__ internals>", line 6, in sum
      File "/Users/wmcneill/src.private/radius_limit/venv/lib/python3.7/site-packages/numpy/core/fromnumeric.py", line 2229, in sum
        initial=initial, where=where)
      File "/Users/wmcneill/src.private/radius_limit/venv/lib/python3.7/site-packages/numpy/core/fromnumeric.py", line 90, in _wrapreduction
        return ufunc.reduce(obj, axis, dtype, out, **passkwargs)
    ValueError: setting an array element with a sequence.
    

    是否可以执行等效的Dask操作?

    0 回复  |  直到 6 年前
        1
  •  1
  •   MRocklin    6 年前

    如果Dask Dataframe能处理这个案子就好了,但现在不行了。考虑到目前的情况,这其实并不奇怪。

    您的数据帧有点奇怪,因为该数据帧的元素本身就是Numpy数组。

    >>> f
                a
    0  [1.0, 2.0]
    1  [3.0, 4.0]
    

    >>> f.dtypes                                                                                         
    a    object
    dtype: object
    

    因为Dask Dataframe是惰性的,它实际上并不跟踪任何给定点上的所有数据,它只知道数据类型,在本例中,这些数据类型是非常非信息性的。Dask Dataframe并不知道如何处理这些复杂元素的平均计算。它不知道您的元素是numpy数组还是字符串,或者自定义Python对象等等。。

    所以它会出错,您需要显式地提供一个数据类型。

    理想情况下,Dask Dataframe会在这里提供更好的错误消息,鼓励您手动指定数据类型。如果你想提出一个问题,那将是受欢迎的。