【问题标题】:Generate a specific number of permutations生成特定数量的排列
【发布时间】: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


【解决方案1】:

看看itertools中的compress()permutations()

for perm in compress(permutation(iterable, r=length), boolean_selection):
    print(perm)

【讨论】:

  • 谢谢,我会再回来看看。我错过了。谢谢!
  • 哎呀,我想我误解了你的问题,我把排列读作permute a list of element,而不是permutation test的排列。
  • 我想专注于排列部分。但我想我并不清楚。我想要一个列表的 N 个排列。而不是列表中 N 元素的所有排列。但是这个答案有助于向我展示一些东西。 1)我可以提取一些排列,排列出来的结果与 random.shuffle 完全不同。它们是有序的。谢谢!
猜你喜欢
  • 2012-12-28
  • 1970-01-01
  • 1970-01-01
  • 2014-04-21
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-06
相关资源
最近更新 更多