2016-12-21 11 views
2

Я пытаюсь оценить dask, преобразовывая метод из thunder (используя Spark) в эквивалентную версию numpy, но я не уверен, как писать это с использованием dask/distribution ,Преобразование функции корреляционного коэффициента из NumPy в Dask

В громом, я могу взять пачку изображений, конвертировать его в серию, и коррелируют с некоторым сигналом:

imgs = thunder.images.fromrandom((10, 900, 900)) 
series = imgs.toseries() 
signal = series[5, 5, :] 
correlated = series.correlate(signal) 

NumPy версия выглядит следующим образом:

series = numpy.random.rand(900, 900, 10) 
signal = series[5, 5, :] 

reshaped = series.reshape(900 * 900, 10) 

correlated = numpy.asarray(
    map(lambda x: numpy.corrcoef(x, signal)[0, 1], reshaped)) 
) 
final = correlated.reshape(900, 900) 

Я m ищет некоторые советы о том, как преобразовать это во что-то для распространения в частности.

ответ

1

Возможно, что-то вроде следующего?

import dask.array as da 
import numpy as np 

imgs = da.random.random((10, 900, 900), chunks=(1, 900, 900)) 
reshaped = imgs.reshape((10, 900 * 900)) 

Если вы хотите, чтобы соотнести свои образа друг против друг

result = da.corrcoef(reshaped) 
result.compute() 

Или против какого-либо другого сигнала

signal = np.random.random(900 * 900) 
result = reshaped.map_blocks(np.corrcoef, signal, dtype=signal.dtype) 
result.compute() 

Однако, я не очень хорошо знаком с приложением, так ответ выше может быть ошибочным.

+0

Да, спасибо, сейчас это легче увидеть! Тем не менее, я получаю 'MemoryError', когда я вызываю' result.compute() ', работающий в поточном режиме. Я попытаюсь воспроизвести это в другой коробке, чтобы убедиться. – Mark

+0

Я бы не удивился ошибкам памяти в случае 'da.corrcoef' (трудно выполнить эту операцию с малой памятью). Я бы не ожидал ошибки памяти во втором случае. Если вы хотите пролистывать диск, вы можете попробовать распределенный планировщик: http://dask.pydata.org/en/latest/scheduler-choice.html – MRocklin

+0

Я думаю, что у меня ошибка из памяти, потому что единственный способ, которым я мог бы понять, как это сделать на 900. Ваш пример изменил размеры ... Мне нужно начать с набора из 10 изображений, которые являются 900x900, а затем перевернуться в временные ряды размера (900, 900, 10). Для этого я начал «imgs» с 'chunks = 900', поэтому моя' reshaped' закончила с 'chunksize = (810000, 10)'. Мне нужно будет только коррелировать с сигналом, последним блоком, который у вас есть выше, но я не могу определить правильный размер блока. – Mark