生成特定数量的排列

时间:2018-04-19 16:19:00

标签: python permutation

我已广泛浏览了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命令会生成所有可能的排列,在我的情况下,这些排列太多而无法处理。

我查看过随机库,但找不到符合我需要的东西。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

查看itertools中的permutations()for perm in compress(permutation(iterable, r=length), boolean_selection): print(perm)

pst.setString(1,"value");