Переполнение стека в dask __array__ - PullRequest
0 голосов
/ 04 мая 2020

У меня довольно простая программа, использующая dask:

import dask.array as darray
import numpy as np

X = np.array([[1.,2.,3.],
              [4.,5.,6.],
              [7.,8.,9.]])
arr = darray.from_array(X)
arr = arr[:,0]
a = darray.min(arr)
b = darray.max(arr)
quantiles = darray.linspace(a, b, 4)
print(np.array(quantiles))

Запуск этой программы приводит к ошибке, подобной этой:

Traceback (most recent call last):
  File "discretization.py", line 12, in <module>
    print(np.array(quantiles))
  File "/Users/zhujun/job/adf/local_training/venv/lib/python3.7/site-packages/dask/array/core.py", line 1341, in __array__
    x = np.array(x)
  File "/Users/zhujun/job/adf/local_training/venv/lib/python3.7/site-packages/dask/array/core.py", line 1341, in __array__
    x = np.array(x)
  File "/Users/zhujun/job/adf/local_training/venv/lib/python3.7/site-packages/dask/array/core.py", line 1341, in __array__
    x = np.array(x)
  [Previous line repeated 325 more times]
  File "/Users/zhujun/job/adf/local_training/venv/lib/python3.7/site-packages/dask/array/core.py", line 1337, in __array__
    x = self.compute()
  File "/Users/zhujun/job/adf/local_training/venv/lib/python3.7/site-packages/dask/base.py", line 166, in compute
    (result,) = compute(self, traverse=False, **kwargs)
  File "/Users/zhujun/job/adf/local_training/venv/lib/python3.7/site-packages/dask/base.py", line 434, in compute
    dsk = collections_to_dsk(collections, optimize_graph, **kwargs)
  File "/Users/zhujun/job/adf/local_training/venv/lib/python3.7/site-packages/dask/base.py", line 220, in collections_to_dsk
    [opt(dsk, keys, **kwargs) for opt, (dsk, keys) in groups.items()],
  File "/Users/zhujun/job/adf/local_training/venv/lib/python3.7/site-packages/dask/base.py", line 220, in <listcomp>
    [opt(dsk, keys, **kwargs) for opt, (dsk, keys) in groups.items()],
  File "/Users/zhujun/job/adf/local_training/venv/lib/python3.7/site-packages/dask/array/optimization.py", line 42, in optimize
    dsk = optimize_blockwise(dsk, keys=keys)
  File "/Users/zhujun/job/adf/local_training/venv/lib/python3.7/site-packages/dask/blockwise.py", line 547, in optimize_blockwise
    out = _optimize_blockwise(graph, keys=keys)
  File "/Users/zhujun/job/adf/local_training/venv/lib/python3.7/site-packages/dask/blockwise.py", line 572, in _optimize_blockwise
    if isinstance(layers[layer], Blockwise):
  File "/anaconda3/lib/python3.7/abc.py", line 139, in __instancecheck__
    return _abc_instancecheck(cls, instance)
RecursionError: maximum recursion depth exceeded in comparison

Python - версия 3.7.1 и dask - версия 2.15.0.

Что не так с этой программой?

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 10 мая 2020

С любой из этих комбинаций пакетов:

dask==2.15.0
numpy<1.16.0
toolz==0.9.0
dask==2.16.0
numpy<1.17.0
toolz==0.9.0

Следующая программа может быть выполнена без проблем:

import dask.array as darray
import numpy as np

X = np.array([[1.,2.,3.],
              [4.,5.,6.],
              [7.,8.,9.]])
arr = darray.from_array(X)
arr = arr[:,0]
a = darray.min(arr)
b = darray.max(arr)

q0 = darray.linspace(a, b, 4)
print(np.array(q0))

Ключ в приведенных выше списках пакетов numpy. Более новые версии numpy могут вызвать ошибку.

Как и предполагал @mdurant, реализация linspace пока не принимает ленивые входные данные; следовательно, тот факт, что эти комбинации пакетов работают, может быть совпадением.

Я оставлю этот вопрос открытым, пока не пойму полностью, что здесь происходит.

0 голосов
/ 05 мая 2020

linspace (пока) не принимает ленивые входы от других вещей, связанных с делом, вам нужны реальные цифры. Используйте compute для материализации этих чисел следующим образом:

a, b = dask.compute(darray.min(arr),  darray.max(arr))
quantiles = darray.linspace(a, b, 4)
...