【发布时间】:2018-04-20 00:26:36
【问题描述】:
我已经广泛浏览了 SO,我发现了很多关于生成所有可能的排列的问题,但没有一个关于生成特定数量的排列的问题。
感谢许多 SO 问题,我开发了一个不错的置换测试例程。但是我必须重复很多次,而且花费的时间太长。
我的代码:
def exact_mc_perm_test(ys, nmc,boolean_selection):
# xs sample from a time series
# ys all time series
# print nmc
# sample difference in mean
mean_ys = np.mean(ys)
diff = np.abs(np.mean(ys[boolean_selection]) - mean_ys)
k=0
for j in np.arange(nmc):
# in place shuffling
np.random.shuffle(ys)
# difference now between fixed all time series and shuffled subsamplevalues
diff_shuffled = np.abs(np.mean(ys[boolean_selection]) - mean_ys)
k += diff < diff_shuffled
return k / nmc
我接受了这个SO answer 并针对我的特定测试对其进行了修改。
我必须在存储在 xarray 中的 3D 数组上运行它。数据集具有 (lon,lat,time) 坐标,我需要为每个 (lon,lat) 位置(沿时间维度)运行它
我使用 chain.iteratools 运行它:
for ii in chain.from_iterable(zip(*dataset.variable())):
iis = ii[selected_position].values
ind_x =dataset.lon==ii.lon
ind_y =dataset.lat==ii.lat
dataset.perm_test[ind_y, ind_x] = exact_mc_perm_test1(iis, ii.values, 1000.,selected_position)
理想情况下,我想运行一个包含 20000 个排列的排列测试。两个循环(在 (lon,lat) 内和 20000 次随机播放)加起来。
我希望加快排列测试代码的速度。
因此,我想尝试生成一个形状为 (len(ys),20000) 的二维数组,其中包含基本上 20000 个随机排列的 ys 数组,然后在其中访问它们并计算 20000 个差异(代码中的差异)。 (或者在内存使用和循环之间找到一个折衷,所以可能一次为 4000 次随机播放做 5 次循环)。
我无法弄清楚或找到一种方法来做到这一点。
来自 itertools 的 permutations 命令会生成所有可能的排列,在我的情况下这些排列太多而无法处理。
我查看了随机库,但找不到适合我需要的东西。有什么建议吗?
【问题讨论】:
-
从您的问题中,您从中生成排列的二维数组有多大并不明显,但如果这足够大,那么只生成随机洗牌而不是限制由 itertools.permutations() 生成的序列。例如,如果您有 100 个元素,那么 100 个因子排列将太大而无法采样,但如果您生成 20000 次随机洗牌,则很有可能您永远不会重复相同的排列。
-
样本不是 100,而是像 40,这仍然太大(至少对于我想做的事情)。事实上,我想我也更喜欢 random.shuffle。有没有办法在没有循环的情况下重复它?
-
我找到了一些可以缩短时间的答案,我会写一个回复。感谢您的投入!
标签: python permutation