如何用随机生成的1D元素填充2D numpy数组而不重复

xriantvc  于 9个月前  发布在  其他
关注(0)|答案(2)|浏览(101)

我试图通过创建一个2D numpy数组来启动物理Monte Carlo模拟,该数组填充了N个1D元素,这些元素对应于每个粒子的x,y和z位置。但是,该数组必须没有任何两个粒子重叠。
我目前正在尝试创建一个列表,用3个随机的intiger填充它,然后检查列表是否在数组中;如果是,则返回创建随机数列表的点并重试。如果列表不存在于数组中,则将列表添加到数组中。

N = 10 #number of particles
L = 10 #length of box side
particle_positions = np.zeros([N,3], dtype=int)
i = 0
for particle in particle_positions:
    z = True
    while z == True:
        r = [rnd.randint(0,L),rnd.randint(0,L),rnd.randint(0,L)]
        if np.equal(particle_positions[:(i+1)],r).any() == True:
            z = True
            continue
        else:
            particle_positions[i] = r
            z = False
            i += 1

字符串
然而,无论我如何尝试,我都会遇到奇怪的复杂情况(也就是说,我做错了什么,我不知道是什么),因此代码跳过了唯一的元素,而没有将它们添加到数组中。
对于python和一般的编码来说,我是相当新的,所以我怀疑我可能犯了一些对你们这些老手来说很明显的错误--如果我确实没有使整个过程过于复杂的话。
非常感谢任何帮助。

hc2pp10m

hc2pp10m1#

您可以使用permutations执行以下操作:

from itertools import permutations
import numpy as np

# random number generator
r = np.random.default_rng()

N = 10  # number of particles
L = 10  # length of box size

# get all permutations of 3 L values
A = np.array([p for p in permutations(range(L), 3)])

# draw N random values (without replacement)
unique = A[r.choice(A.shape[0], N, replace=False), :]

字符串

mrzz3bfm

mrzz3bfm2#

这似乎是在检查paricle是否已经存在于列表中。

numpy.any([ numpy.all( numpy.equal(o, r) ) for o in particle_positions[:i]])

字符串
你的检查似乎是为了看看是否有任何单一的值对齐。

相关问题