我已广泛浏览了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 shuffle)加起来。
我希望加快排列测试代码。
因此,我试图生成一个2D阵列的形状(len(ys),20000),基本上有20000个混洗ys数组,然后在1处访问它们并计算20000个差异(代码中的差异)。 (或者在内存使用和循环之间找到折衷方案,因此当时可以进行5次循环以进行4000次shuffle。)
我无法弄清楚或找到一种方法来做到这一点。
来自itertools的permutations命令会生成所有可能的排列,在我的情况下,这些排列太多而无法处理。
我查看过随机库,但找不到符合我需要的东西。有什么建议吗?
答案 0 :(得分:0)
查看itertools中的permutations()
和for perm in compress(permutation(iterable, r=length), boolean_selection):
print(perm)
:
pst.setString(1,"value");