2016-12-21 1 views
2

J'essaie d'évaluer dask en convertissant une méthode de thunder (en utilisant Spark), à la version numpy équivalente, mais je ne suis pas sûr comment écrire cela en utilisant dask/distributed .Conversion d'une fonction de coefficient de corrélation de NumPy à Dask

le tonnerre, je peux prendre une pile d'images, le convertir en une série, et en corrélation contre certains signaux:

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

La version numpy ressemble à ceci:

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) 

Je Je cherche quelques conseils sur la façon de le convertir en quelque chose pour distribué en particulier.

Répondre

1

Peut-être quelque chose comme ce qui suit?

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)) 

Si vous vouliez établir une corrélation entre vos images les uns contre les autres

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

ou contre un autre signal de

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

Cependant, je ne suis pas très familier avec votre application, de sorte que le la réponse ci-dessus peut être erronée.

+0

Oui, merci, c'est plus facile de voir ça maintenant! Cependant, j'obtiens un 'MemoryError' quand j'appelle' result.compute() ', s'exécutant en mode threadé. Je vais essayer de reproduire cela sur une autre boîte juste pour être sûr. – Mark

+0

Je ne serais pas surpris par une erreur de mémoire dans le cas 'da.corrcoef' (il est difficile de faire cette opération avec peu de mémoire). Je ne m'attendrais pas à une erreur de mémoire dans le second cas. Si vous voulez renverser sur le disque, vous pouvez essayer le planificateur distribué: http://dask.pydata.org/en/latest/scheduler-choice.html – MRocklin

+0

Je pense que je reçois une erreur de mémoire parce que la seule façon pourrait trouver comment chunk il était de 900. Votre exemple a inversé les dimensions ... Je dois commencer avec un ensemble de 10 images qui sont 900x900 et ensuite basculer dans une série chronologique de taille (900, 900, 10). Pour ce faire, j'ai lancé 'imgs' avec' chunks = 900', donc mon 'remodelé' a fini par avoir' chunksize = (810000, 10) '. Je n'aurais besoin que de corréler avec le signal, le dernier bloc que vous avez ci-dessus, mais je ne peux pas déterminer la taille de bloc correcte. – Mark