与许多其他numpy/随机函数不同,numpy.random.Generator.permutation()没有提供在单个函数调用中返回多个结果的明显方法。给定一个(1d) numpy数组x,我希望对x的n排列(每个长度为len(x))进行采样,并将结果作为一个具有(n, len(x))形状的numpy数组。生成许多排列的一种天真方法是np.array([rng.permutation(x) for _ in range(n)])。这并不理想,主要是因为循环在Python中,而不是在已编译的numpy函数中。
import numpy as np
rng = np.random.default_rng(1234)
# x is big enough to not want to enumerate all permutations
x = rng.standard_normal(size=20)
n = 10000
perms = np.array([rng.permutation(x) for _ in range(n)])我的用例是用蛮力搜索来查找使特定属性最小化的排列(构成“足够好”的搜索解决方案)。我可以使用numpy操作来计算每个置换的感兴趣性质,这些操作能够很好地向向量/广播结果的排列矩阵。事实证明,天真地生成排列矩阵是我代码中的瓶颈。有更好的办法吗?
发布于 2022-01-12 18:05:43
您可以使用rng.permuted而不是rng.permutation,并将其与np.tile结合起来,以便多次重复x,并对每个副本进行单独的洗牌。以下是如何:
perms = rng.permuted(np.tile(x, n).reshape(n,x.size), axis=1)在我的机器上,这比你的初始代码快10倍。
https://stackoverflow.com/questions/70683286
复制相似问题