當在包含numpy數組的dask.bag
上執行foldby
時,我從dask
/numpy
得到非常無意義的FutureWarning
消息。dask bag foldby with numpy arrays
def binop(a, b):
print('binop')
return a + b[1]
def combine(a, b):
print('combine')
return a + b[1]
seq = ((np.random.randint(0, 5, size=1)[0], np.ones(5,)) for _ in range(50))
db.from_sequence(seq, partition_size=10)\
.foldby(0, binop=binop, initial=np.zeros(5,), combine=combine)\
.compute()
目標是加起來一堆NumPy
數組。這會產生正確的結果,但也產生FutureWarning
消息(看起來像每個分區一個)NumPy
雖然它看起來好像他們來自dask
。
dask/async.py:247:FutureWarning:elementwise comparison failed;返回標代替,但在未來將執行的elementwise比較 回報FUNC(* args2)
只是增加了兩個numpy
陣列,而不dask
不會產生這樣有明確的一些參與與並行.foldby
這裏。看起來在任何計算完成之前都會生成警告。
- 如何確定警告是否應該關注?
- 如果我應該關注它,我該如何讓警告消失?
我使用python 3.6
DASK 0.14.1
和numpy的1.12.1
UPDATE
感謝@ MRocklin的答案,我開始尋找到這個多一點。因此,在dask.async.py
有問題的代碼是this
def _execute_task(arg, cache, dsk=None):
....
if isinstance(arg, list):
return [_execute_task(a, cache) for a in arg]
elif istask(arg):
func, args = arg[0], arg[1:]
args2 = [_execute_task(a, cache) for a in args]
return func(*args2)
是有可能,dask
實際上是在試圖遍歷numpy
數組中args2 = [_execute_task(a, cache) for a in args]
,我不知道內部不夠好(在所有的時候)的判斷這些變量包含的內容。
我仍然不明白,雖然'dask'正在做的陣列產生的警告。該案例的評論爲:「這個條件基本上意味着」我們註定要失敗「,b/c」靈活的「dtypes - 字符串和無效 - 不能有自己註冊的ufunc循環...。這是沒有意義的,因爲數組的'dtype'是'float64',而不是'string'或'void'。請參閱上面修改的問題 –
Dask.bag只是調用您提供的功能。它沒有引入任何特殊的邏輯。 – MRocklin
我正確地認爲,如果'init'是一個可調用的函數,它會爲每個執行器調用一次嗎?這就是'cytoolz'代碼的樣子 –