繁体   English   中英

如何在 Python 中创建一个二维数组,其中每列都有不同的随机元素数

[英]How to create a 2D array in Python where each column has a different and random number of elements

我正在编写到达探测器的光子的蒙特卡罗模拟。 检测到的光子N_detected遵循泊松分布(我使用scipy.stats.poisson生成)并且每个光子的检测时间遵循给定的概率分布 function (PDF)。 为了生成N_detected光子的检测时间,我使用numpy.random.random() function 生成介于 0 和 1 之间的N_detected随机数,并使用Inverse Transform Method

我必须多次运行模拟。 因此,为了避免重复很多次,我想使用 numpy arrays 一次进行每个模拟。 作为最终结果,我想获得一个由N_sim列组成的二维数组,其中每一列对应于不同的模拟,并包含生成的检测时间。 问题是每个模拟都会产生不同数量的光子(因为它是随机的),而且我找不到创建具有不同长度列的 2D 阵列的方法。

我的一个想法是创建具有相同长度(最大N_deteceted )的所有列,并用NaN和 rest 用我需要的随机数填充不需要的元素,但我不知道我能做到这一点。

这是迄今为止我能做到的最好的:

import numpy as np
import numpy.ma as ma
from scipy.stats import poisson

beta = 0.0048    # Parameter of the PDF

""" Inverse of the time CDF (needed for the Inverse transform method) """

def inverse_time_cdf(x):
    return -np.log( (np.exp(-1000*beta)-1)*x + 1 )/beta


""" Simulation of N_sim experiments through the inverse transfrom method """

T = 1000    # Duration of the experiment [s]
rate = 3.945    # [events/s]
lam = rate*T    # Poisson distribution parameter

def photon_arrival_simulation(N_sim):
    N_detection = poisson.rvs(lam, size = N_sim)    # Number of detections in each experiment
    t = np.array([inverse_time_cdf(np.random.random(N)) for N in N_detection])

    return N_detection, t

如果可能的话,我想避免在photon_arrival_simulation() function 的列表理解中使用的循环,并且还获得一个二维数组而不是 arrays 的数组(因为我不能进行数组操作,例如在数组上log数组)。

我不知道我是否应该在这里或物理堆栈交换中发布这个问题,但提前感谢任何人。

我认为不可能在不循环某处的情况下沿行创建一个长度可变的随机数组来填充 NaN 值。 但这是解决二维数组问题的方法,您有使用 NaN 的正确想法。 我肯定会在掩码 arrays 上使用 NaN,因为掩码 arrays 更多的是为了方便而不是性能。 此外,您应该将文档字符串放在 function 声明下方的适当位置。

def photon_arrival_simulation(N_sim):
    """Simulation of N_sim experiments through the inverse transform method"""

    N_detection = poisson.rvs(lam, size=N_sim)

    rand = np.random.random((len(N_detection), N_detection.max()))

    for i, N in enumerate(N_detection):
        rand[i, N:] = np.nan

    t = inverse_time_cdf(rand)

    return N_detection, t

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM