从笛卡尔积中获取随机抽样

getting random sampling from cartesian product

提问人:user804141 提问时间:9/6/2023 更新时间:9/6/2023 访问量:30

问:

考虑复数 z = x+iy。我有一个对象构造函数类,它可以获取一个复数并从中绘制一些东西,比如说。pole(x,y)

我想构造一个数组,考虑 x 和 y 的所有可能组合,以便我可以绘制一个方形网格。假设 x 和 y 是

a = [0,1,2]
b = [0,1,2]

那么我感兴趣的阵列是c = np.asarray(list(it.product(a,b)))

使用另一个复数 w = u+iv,我还可以逐点绘制以下内容:.我想构造一个考虑 z 和 w 所有可能组合的数组,为此我的尝试是pole(x,y)*pole(u,v)

d = c.copy()
e = np.asarray(list(it.product(c,d)))

到目前为止,代码正在按预期工作,特别是当我考虑只有五个元素的初始数组 a,b 时。但是,在原始问题中,我需要考虑至少包含 1000 个元素的初始数组 a,b。最糟糕的是,我需要考虑这意味着我有一个包含 (1000*1000)^4 个元素的数组。pole(x,y)*pole(u,v)*pole(...)*pole(...)

您建议我创建一个数组来存储 2 个参数、2x2 参数、2x2x2 参数等的所有可能组合?

我尝试使用认为它比它更有效,但在第一次实例后我不知所措np.meshgridit.product

x,y = np.transpoe(np.meshgrid(a,b)).reshape(-1,2)

如果我想考虑下一个复数 w,我不确定如何实现网格网格。

我也在考虑列出 (x,y)、(x,y) 和 (u,v) 等所有可能的组合,我可以从它们的组合中随机选择,而无需构建一个巨大的列表来节省内存。但是,我不确定如何重新定义它(文档

def random_product(*args, **kwds):
    "Random selection from itertools.product(*args, **kwds)"
    pools = map(tuple, args) * kwds.get('repeat', 1)
    return tuple(random.choice(pool) for pool in pools)

以适应我想要的东西。

python-3.x 随机 笛卡尔乘积

评论


答:

0赞 MegaIng 9/6/2023 #1

(1000*1000)^4bytes 是 1 yottabyte,因此构建数组不是一种选择,您的 PC 没有足够的内存。

您需要修复该函数以兼容 python3,并针对您的用例进行轻微调整:

def random_product(*args, **kwds):
    "Random selection from itertools.product(*args, **kwds)"
    pools = list(args) * kwds.get('repeat', 1)
    return tuple(random.choice(pool) for pool in pools)

然后,您可以像这样使用它:

x,y, u,v, s,t = random_product(a, b, c, d, e, f)

列表或一维数字数组在哪里定义您关心的每个维度中的可能坐标。a-f

现在可以将结果连接成复数:、、x + y*1ju + v*1js + t*1j

如果您不想使用关键字(因此不能选择使用相同的值 for for ),最好不要使用函数的第二行,而只是在 return 语句中使用而不是使用。repeatc,da,bargspools