【问题标题】:matlab: randomly permuting rows and columns of a 2-D arraymatlab:随机排列二维数组的行和列
【发布时间】:2011-12-09 17:39:38
【问题描述】:

我有一个大矩阵(大约 80,000 X 60,000),我基本上想打乱所有条目(即,独立地随机排列行和列)。

我相信如果我遍历列并使用 randperm 随机排列每一列,它会起作用。 (或者,我同样可以做行。)由于这涉及一个具有 60K 迭代的循环,我想知道是否有人可以提出更有效的选择?

我也一直在使用 numpy/scipy,所以如果您知道 python 中有一个不错的选择,那也很好。

谢谢! 苏珊

感谢所有深思熟虑的答案!更多信息:矩阵的行表示文档,每行中的数据是该文档的 tf-idf 权重向量。每列对应于词汇表中的一个术语。我正在使用 pdist 计算所有论文对之间的余弦相似度。我想生成一组随机的论文进行比较。

我认为只是排列列会起作用,因为每篇论文都被分配了一组随机的术语频率。 (排列行只是意味着重新排序论文。)正如 Jonathan 指出的那样,这具有不制作整个矩阵的新副本的优点,而且听起来其他选项都可以。

【问题讨论】:

  • 对所有条目进行打乱并不等同于对行和列进行独立打乱。 n!m! 不是 (nm)!。这意味着您不会通过打乱行和列来获得所有情况。这对你重要吗?你更喜欢哪个选项?

标签: python matlab random permutation


【解决方案1】:

您应该能够将reshape 矩阵转换为 1 × 4800000000 的“数组”,randperm 它,最后将 reshape 它转换回一个 80000 × 60000 的矩阵。

这将需要复制 48 亿个条目,最坏的情况是 3 次。这可能效率不高。

编辑:实际上 Matlab 自动使用线性索引,所以不需要第一个 reshape。只是

reshape(x(randperm(4800000000), 80000, 60000))

就足够了(从而减少了 1 次不必要的潜在复制)。


请注意,这假设您有一个密集矩阵。如果您有一个稀疏矩阵,您可以提取值,然后随机重新分配索引给它们。如果有 N 个非零条目,那么最坏情况下只需要复制 8N 次(需要 3 个数字来描述一个条目)。

【讨论】:

    【解决方案2】:

    我认为这样做会更好:

    import numpy as np
    
    flat = matrix.ravel()
    np.random.shuffle(flat)
    

    您基本上是将矩阵展平为一个列表,对列表进行洗牌,然后从列表中重新构建一个矩阵。

    【讨论】:

    • 如果您建议 numpy.random.shuffle 并跳过 tolist,我会给您 +1。当它包含 4.8e+09 个元素时,将整个矩阵复制到一个列表中非常昂贵。
    • 对不起,我不使用 Numpy 的矩阵足以知道所有这些。当我真的必须时,我会使用 Sage。
    • 我冒昧地纠正了这个例子。请注意,它适用于np.array,但不适用于np.matrix(至少不适用于我的盒子)。
    • @larsmans:谢谢。我编写示例的机器上没有 Numpy,所以我不确定它是否会运行。
    【解决方案3】:

    上述两种解决方案都很棒,并且会起作用,但我相信这两种解决方案都涉及在工作时在内存中制作整个矩阵的全新副本。由于这是一个巨大的矩阵,这非常痛苦。对于 MATLAB 解决方案,我认为您可能会创建两个额外的临时副本,具体取决于 reshape 在内部的工作方式。我认为您通过对列进行操作是在正确的轨道上,但问题是它只会沿着列进行争夺。但是,我相信如果你在那之后沿着行做 randperm,你最终会得到一个完全置换的矩阵。这样,您只会创建临时变量,最坏的情况是 80,000 x 1。是的,这是两个循环,每个循环有 60,000 和 80,000 次迭代,但无论如何都必须在内部发生。该算法将必须至少访问每个内存位置两次。您可能可以通过编写一个完全就地操作的 C MEX 函数来实现更高效的算法,但我认为您不希望这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-29
      • 2015-08-26
      • 1970-01-01
      • 2016-01-08
      • 2021-03-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多