Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python matlab:随机排列二维数组的行和列_Python_Matlab_Random_Permutation - Fatal编程技术网

Python matlab:随机排列二维数组的行和列

Python matlab:随机排列二维数组的行和列,python,matlab,random,permutation,Python,Matlab,Random,Permutation,我有一个很大的矩阵(大约80000 X 60000),我基本上希望对所有条目进行置乱(即,独立地随机排列行和列) 我相信如果我在列上循环,并使用randperm随机排列每一列,它会起作用。(或者,我同样可以做行。)因为这涉及到一个60K迭代的循环,我想知道是否有人可以建议一个更有效的选项 我也一直在使用numpy/scipy,所以如果您知道python中的一个好选项,那也将非常好 谢谢! 苏珊 感谢所有深思熟虑的回答!更多信息:矩阵的行表示文档,每行中的数据是该文档的tf idf权重向量。每列对

我有一个很大的矩阵(大约80000 X 60000),我基本上希望对所有条目进行置乱(即,独立地随机排列行和列)

我相信如果我在列上循环,并使用randperm随机排列每一列,它会起作用。(或者,我同样可以做行。)因为这涉及到一个60K迭代的循环,我想知道是否有人可以建议一个更有效的选项

我也一直在使用numpy/scipy,所以如果您知道python中的一个好选项,那也将非常好

谢谢! 苏珊

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


我认为仅仅排列列就行了,因为每篇论文都会被分配一组随机的术语频率。(排列行只意味着重新排列文件。)正如Jonathan指出的,这有一个优点,即不需要对整个矩阵进行新的复制,而且听起来其他选项都会这样做。

我认为这样做会更好:

import numpy as np

flat = matrix.ravel()
np.random.shuffle(flat)

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

我认为这样做会更好:

import numpy as np

flat = matrix.ravel()
np.random.shuffle(flat)
您基本上是将矩阵展平为一个列表,对列表进行洗牌,然后从列表中重新构造一个矩阵。

您应该能够
将矩阵重塑为1×480000000“数组”,
randperm
它,最后
将其重塑为80000×60000矩阵

这将需要复制48亿个条目,最多复制3次。这可能没有效率

编辑:实际上Matlab自动使用线性索引,因此不需要第一次
重塑
。只是

reshape(x(randperm(4800000000), 80000, 60000))
足够(从而减少1个不必要的潜在复制)


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

您应该能够
将矩阵重塑为1×480000000“数组”,
randperm
它,最后
将其重塑为80000×60000矩阵

这将需要复制48亿个条目,最多复制3次。这可能没有效率

编辑:实际上Matlab自动使用线性索引,因此不需要第一次
重塑
。只是

reshape(x(randperm(4800000000), 80000, 60000))
足够(从而减少1个不必要的潜在复制)



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

上述两种解决方案都很好,而且都会起作用,但我相信这两种解决方案都需要在执行工作时在内存中创建整个矩阵的全新副本。因为这是一个巨大的矩阵,这是相当痛苦的。对于MATLAB解决方案,我认为您可能会创建两个额外的临时副本,具体取决于重塑在内部的工作方式。我认为你在立柱上操作是正确的,但问题是它只会沿着立柱移动。然而,我相信如果在那之后对行进行randperm,最终将得到一个完全置换的矩阵。这样,您将只创建临时变量,最坏的情况是80000乘1。是的,这是两个循环,每个循环有60000次和80000次迭代,但在内部,不管怎样,这都必须发生。算法必须访问每个内存位置至少两次。您可能可以编写一个完全就地运行的C MEX函数来实现一个更高效的算法,但我认为您不愿意这样做。

以上两种解决方案都很好,而且都会起作用,但我相信这两种解决方案都涉及到在内存中创建整个矩阵的全新副本。因为这是一个巨大的矩阵,这是相当痛苦的。对于MATLAB解决方案,我认为您可能会创建两个额外的临时副本,具体取决于重塑在内部的工作方式。我认为你在立柱上操作是正确的,但问题是它只会沿着立柱移动。然而,我相信如果在那之后对行进行randperm,最终将得到一个完全置换的矩阵。这样,您将只创建临时变量,最坏的情况是80000乘1。是的,这是两个循环,每个循环有60000次和80000次迭代,但在内部,不管怎样,这都必须发生。算法必须访问每个内存位置至少两次。您可能可以编写一个完全就地运行的C MEX函数来实现一个更高效的算法,但我想您最好不要这样做。

如果您建议
numpy.random.shuffle
并跳过
tolist
,我会给您一个+1。当包含4.8e+09个元素时,将整个矩阵复制到列表中的成本非常高。抱歉,我对矩阵使用的Numpy不够了解所有这些。当我真的需要的时候,我会使用Sage。我已经冒昧地纠正了这个例子。请注意,它适用于
np.array
,但不适用于
np.matrix
(至少不在我的框中)。@larsmans:谢谢。我在编写示例的机器上没有Numpy,因此我不确定它是否会运行。如果您建议
Numpy.random.shuffle
并跳过
tolist
,我会给您一个+1。将整个矩阵复制到li中