我导入了一个大数组,我想随机迭代所有行排列。
该代码被设计为在某个数组产生所需的解决方案时中断。
到目前为止的尝试涉及正常的迭代扰动过程:
import numpy as np
import itertools
file = np.loadtxt("my_array.csv", delimiter=", ")
for i in itertools.permutations(file):
** do something **
if condition:
break
然而,我希望迭代能够覆盖所有扰动并且是随机的,没有重复。
理想情况下,(不同于Python 中的随机迭代 https://stackoverflow.com/questions/9252373/random-iteration-in-python)我还会避免将数组的所有排列存储在内存中。
因此,基于生成器的解决方案将是最好的。
有一个简单的解决方案吗?
答案是首先编写一个函数,给定 [0, n!) 中的整数 k,返回第 k 个排列:
def unrank(n, k):
pi = np.arange(n)
while n > 0:
pi[n-1], pi[k % n] = pi[k % n], pi[n-1]
k //= n
n -= 1
return pi
该技术被发现于作者:温迪·梅尔沃德和弗兰克·鲁斯基。
然后,如果我们可以生成 [0, n!) 的随机排列,我们就完成了。我们可以找到一种技术(无需构建整个排列)有时递归洗牌 https://eprint.iacr.org/2013/560.pdf作者:本·莫里斯和菲利普·罗格威。我有一个可用的实现here https://gist.github.com/orlp/33535eefce782a59e185e4a971cda1a3.
那么,我们所要做的就是:
import math
a = np.array(...) # Load data.
p = SometimeShuffle(math.factorial(len(a)), "some_random_seed")
for kth_perm in p:
shuffled_indices = unrank(len(a), kth_perm)
shuffled_a = a[shuffled_indices]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)