如何优化循环以在python中生成一个新的随机泊松数组?

问题描述:

我想要读取一个灰度图像,用(248,480,3)形状表示一些东西,然后使用它的每个元素作为制作Poisson随机值的lam值,并为每个元素执行此操作并创建一个新的数据集具有相同的形状。我想这样做多达nscan,然后我想将它们全部加在一起,并将它们放入一个新的数据集中,并再次绘制它以获得与我在开始时放置的第一张图像相似的内容。此代码正在工作,但速度非常慢,我想知道是否有任何方法可以使其更快?如何优化循环以在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) 

numpy.random.poisson可以完全替代genP()功能...这基本上是有保证要快得多。

如果大小为无(默认),如果lam是标量,则返回单个值。否则,绘制np.array(lam).size样本

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