2017-10-13 68 views
1

我想要讀取一個灰度圖像,用(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) 

回答

1

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