我觉得这个应该很容易,但是经过无数次的搜索和尝试之后,我还是无法找到答案。基本上,我有很多项目要随机抽样,无需替换。在这种情况下,它们是2D阵列中的单元格。我用来缩小阵列的解决方案并不翻译,因为它需要在记忆阵列中进行打乱。如果我要抽查的数字很小,我也可以随机抽查项目,并保留我尝试过的数值清单。不幸的是,我经常要对所有细胞中的非常大比例进行抽样,无论数量多。
我所要创建的是一个迭代器,它使用一些迭代器、缩水和/或随机组合,产生下一个随机单元格(x和y 指数)。另一个可能的解决办法是创建一个迭代器,在 0 和 (x_count * y_count) 之间产生下一个随机数字(不替换),而我可以将数字映射回单元格位置。这两个数字似乎都不容易完成。
谢谢你的帮忙!
这是我目前的解决办法。
import numpy as np
import itertools as itr
import random as rdm
#works great
x_count = 10
y_count = 5
#good luck!
#x_count = 10000
#y_count = 20000
x_indices = np.arange(x_count)
y_indices = np.arange(y_count)
cell_indices = itr.product(x_indices, y_indices)
list_cell_indices = list(cell_indices)
rdm.shuffle(list_cell_indices)
for i in range(25):
print list_cell_indices[i]
因此,根据目前的反应和我试图翻译的Perl, 我对此一无所知, 我的理解是,我能做的最好的就是:
import numpy as np
import itertools as itr
import random as rdm
x_count = 10000
y_count = 5000
sample_count = 10000
keep_probability = 0.01
tried_cells = set()
kept_cells = set()
while len(kept_cells) < sample_count:
x = rdm.randint(0, x_count)
y = rdm.randint(0, y_count)
if (x, y) in tried_cells:
pass
else:
tried_cells.add((x, y))
keep = rdm.random() < keep_probability
if keep:
kept_cells.add((x,y))
print "worked"
在大多数情况下,所使用的处理时间和内存并不那么糟糕。 也许我可以检查一下平均单元格的保存概率和抽样数,然后对困难案例出错。