如何优化循环以在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()