首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >一种简单的光子探测仿真优化

一种简单的光子探测仿真优化
EN

Stack Overflow用户
提问于 2022-01-22 05:21:28
回答 2查看 199关注 0票数 1

我是一名医学物理专业的学生,试图模拟光子探测--我成功了(下面),但我想通过加速来使它变得更好:它现在需要50秒才能运行,而且我希望它在那段时间的一些时间内运行。我认为,更熟悉Python的人可以在不到10秒的时间内对其进行优化(而不降低num_photons_detected值)。非常感谢您尝试了这个小小的优化挑战。

代码语言:javascript
运行
复制
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()
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-01-22 06:26:57

我认为,除了效率问题,代码的一个问题是它没有真正随机地选择光子的位置。相反,它选择行号,然后为每一行选择列号,其中光子将在该行中观察到。因此,如果没有选择一个行号,那一行中就根本没有光子,如果同一行被选中几次,其中就会有许多光子。这一点在生产出来的地块中是可见的,这些地块有明显的较浅和较暗的行的图案:

假设这是无意的,并且每个像素应该有相同的被选择机会,下面是一个函数,它生成一个给定大小的数组,并具有给定数目的随机选择像素:

代码语言:javascript
运行
复制
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)

您可以使用它生成具有指定参数的图像。例如:

代码语言:javascript
运行
复制
import matplotlib.pyplot as plt

pixels = generate_photons(rows=25, cols=25, num_photons=10**4)
plt.imshow(pixels, cmap="gray")
plt.show()

给予:

票数 4
EN

Stack Overflow用户

发布于 2022-01-22 05:44:33

代码语言:javascript
运行
复制
photons_random_pixel_choice = np.array([random.choice(index_range) for z in range(rows)]) 

这里的目标似乎是:

  1. 使用预先生成的整数序列(0到24包含在内)来选择其中的一个值.
  2. 在列表理解中重复该过程25次,以获得该范围内25个随机值的Python列表。
  3. 根据这些结果创建一个一维Numpy数组。

这远远没有达到使用Numpy的目的。如果我们想要在一个范围内的整数,那么我们可以直接要求这些。但是更重要的是,当使用Numpy数据结构时,我们应该让Numpy尽可能多地执行循环。这就是它支付给阅读文件的地方

大小: int或tuple of int,可选的输出形状。如果给定的形状是,例如(m, n, k),则绘制m * n * k样本。默认值是None,在这种情况下返回单个值。

所以,直接做吧:photons_random_pixel_choice = random.integers(rows, size=(rows,))

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70810227

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档