我是一名医学物理专业的学生,试图模拟光子探测--我成功了(下面),但我想通过加速来使它变得更好:它现在需要50秒才能运行,而且我希望它在那段时间的一些时间内运行。我认为,更熟悉Python的人可以在不到10秒的时间内对其进行优化(而不降低num_photons_detected值)。非常感谢您尝试了这个小小的优化挑战。
from random import seed
from random import random
import random
import matplotlib.pyplot as plt
import numpy as np
rows, cols = (25, 25)
num_photons_detected = [10**3, 10**4, 10**5, 10**6, 10**7]
lesionPercentAboveNoiseLevel = [1, 0.20, 0.10, 0.05]
index_range = np.array([i for i in range(rows)])
for l in range(len(lesionPercentAboveNoiseLevel)):
pixels = np.array([[0.0 for i in range(cols)] for j in range(rows)])
for k in range(len(num_photons_detected)):
random.seed(a=None, version=2)
photons_random_pixel_choice = np.array([random.choice(index_range) for z in range(rows)])
counts = 0
while num_photons_detected[k] > counts:
for i in photons_random_pixel_choice:
photons_random_pixel_choice = np.array([random.choice(index_range) for z in range(rows)]) #further ensures random pixel selection
for j in photons_random_pixel_choice:
pixels[i,j] +=1
counts +=1
plt.imshow(pixels, cmap="gray") #in the resulting images/graphs, x is on the vertical and y on the horizontal
plt.show()发布于 2022-01-22 06:26:57
我认为,除了效率问题,代码的一个问题是它没有真正随机地选择光子的位置。相反,它选择行号,然后为每一行选择列号,其中光子将在该行中观察到。因此,如果没有选择一个行号,那一行中就根本没有光子,如果同一行被选中几次,其中就会有许多光子。这一点在生产出来的地块中是可见的,这些地块有明显的较浅和较暗的行的图案:

假设这是无意的,并且每个像素应该有相同的被选择机会,下面是一个函数,它生成一个给定大小的数组,并具有给定数目的随机选择像素:
import numpy as np
def generate_photons(rows, cols, num_photons):
rng = np.random.default_rng()
indices = rng.choice(rows*cols, num_photons)
np.add.at(pix:=np.zeros(rows*cols), indices, 1)
return pix.reshape(rows, cols)您可以使用它生成具有指定参数的图像。例如:
import matplotlib.pyplot as plt
pixels = generate_photons(rows=25, cols=25, num_photons=10**4)
plt.imshow(pixels, cmap="gray")
plt.show()给予:

发布于 2022-01-22 05:44:33
photons_random_pixel_choice = np.array([random.choice(index_range) for z in range(rows)]) 这里的目标似乎是:
这远远没有达到使用Numpy的目的。如果我们想要在一个范围内的整数,那么我们可以直接要求这些。但是更重要的是,当使用Numpy数据结构时,我们应该让Numpy尽可能多地执行循环。这就是它支付给阅读文件的地方
大小: int或tuple of int,可选的输出形状。如果给定的形状是,例如
(m, n, k),则绘制m * n * k样本。默认值是None,在这种情况下返回单个值。
所以,直接做吧:photons_random_pixel_choice = random.integers(rows, size=(rows,))。
https://stackoverflow.com/questions/70810227
复制相似问题