我觉得这应该很容易,但经过多次搜索和尝试,我无法找到答案。基本上我有大量的物品,我想以随机顺序抽样而不更换。在这种情况下,它们是二维数组中的单元。我将用于较小数组的解决方案无法转换,因为它需要改组内存数组。如果我必须抽样的数量很小,我也可以随机抽样项目并保留我尝试过的值的列表。不幸的是,我经常不得不对所有细胞中的很大一部分进行采样,就像所有细胞一样多。
我想要创建的是一个迭代器,它使用迭代工具、numpy 和/或随机的某种组合来产生下一个随机单元(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"
在大多数情况下,使用的处理时间和内存并没有那么糟糕。也许我可以检查平均细胞 keep_probability 和 sample_count 并在困难的情况下抛出错误。