2017-10-13 4 views
1

Je veux lire une image en niveaux de gris, dire quelque chose avec (248, 480, 3) forme, puis utiliser chaque élément comme valeur de lam pour faire une valeur aléatoire de Poisson et faire ceci pour chaque élément et créer un nouvel ensemble de données avec la même forme. Je veux le faire autant que nscan, puis je veux les ajouter tous ensemble et les mettre dans un nouvel ensemble de données et le tracer à nouveau pour obtenir quelque chose qui est similaire à la première image que j'ai mis au début. Ce code fonctionne mais il est extrêmement lent, je me demandais s'il y avait moyen de le rendre plus rapide?Comment optimiser les boucles pour générer un nouveau tableau de Poisson aléatoire en python?

import numpy as np 
import matplotlib.pyplot as plt 

my_image = plt.imread('myimage.png') 


def genP(data): 

    new_data = np.zeros(data.shape) 

    for i in range(data.shape[0]): 

     for j in range(data.shape[1]): 

      for k in range(data.shape[2]): 

       new_data[i, j, k] = np.random.poisson(lam = data[i, j, k]) 


    return new_data   



def get_total(data, nscan = 1): 

    total = genP(data) 

    for i in range(nscan): 

     total += genP(data) 

    total = total/nscan 


    plt.imshow(total) 
    plt.show() 


get_total(my_image, 100) 

Répondre

1

numpy.random.poisson peut entièrement remplacer votre fonction genP() ... Ceci est essentiellement garanti d'être beaucoup plus rapide.

Si la taille est Aucune (valeur par défaut), une seule valeur est renvoyée si lam est un scalaire. Dans le cas contraire, np.array (MAMA) des échantillons de .Size sont tirés

def get_total(data, nscan = 1): 
    total = np.random.poisson(lam=data) 
    for i in range(nscan): 
     total += np.random.poisson(lam=data) 
    total = total/nscan 
    plt.imshow(total) 
    plt.show()