python - 在 numpy 矩阵中一次打乱一列的有效方法

标签 python performance numpy matrix

我需要将 numpy 矩阵的所有列一一打乱。 这是我当前的代码

n, p = X.shape
val = []
for i in range(p):
    Xt = X.copy()
    np.random.shuffle(Xt[:, i])
    print(Xt)

我每次都将 X 复制到变量 Xt。这似乎是非常低效的。

我怎样才能加快这段代码的速度?

编辑:示例 鉴于

`X= [[0 3 6]
    [1 4 7]
    [2 5 8]]`

for 循环的预期输出是:

>>> [[2 3 6]
 [1 4 7]
 [0 5 8]] 

[[0 5 6]
 [1 4 7]
 [2 3 8]] 

[[0 3 7]
 [1 4 8]
 [2 5 6]] 

>>> 

每次只能打乱一列。所有其他列应具有与原始矩阵相同的值

最佳答案

在 numpy 中打乱一列可以就地完成,根本不需要复制:

import numpy as np
X = np.arange(25).reshape(5,5).transpose()
print X
np.random.shuffle(X[:,2])  # here, X[:,2] is a just a view onto this column of X
print X

输出是:

[[ 0  1  2  3  4]  # the original
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]
 [20 21 22 23 24]]

[[ 0  1  2  3  4]  # note that the middle column is shuffled here
 [ 5  6 12  8  9]
 [10 11 22 13 14]
 [15 16 17 18 19]
 [20 21  7 23 24]]

您正在进行大量复制,很难判断其中是否有必要满足您的整体需求,但洗牌不需要。

编辑:
这道题虽然是按照洗牌的方式写的,但是因为洗牌可以原地进行,所以实际效率低下是因为抄袭。因此,问题就变成了 OP 在副本方面需要什么?由于需要恢复原始数组,因此需要对某些附加索引或数组值进行一些复制或复制。在这种情况下,唯一的效率是希望不需要为每个循环复制整个数组,而只需要复制列(或者,基本上等价的,复制整个矩阵一次——与复制矩阵 p 相比- 在问题的示例和@ajcr 中完成的时间)。以下生成器只是逐行执行此操作:

def sc(x):
    p = X.shape[1]
    for i in range(p):
        hold = np.array(x[:,i])
        np.random.shuffle(x[:,i])
        yield x
        x[:,i] = hold

for i in sc(X):
    print i

给出:

[[ 2  5 11 15 20]    # #0 column shuffled
 [ 3  6 10 16 21]
 [ 0  7 14 17 22]
 [ 4  8 13 18 23]
 [ 1  9 12 19 24]]

[[ 0  5 11 15 20]    # #1 column shuffled
 [ 1  8 10 16 21]
 [ 2  9 14 17 22]
 [ 3  7 13 18 23]
 [ 4  6 12 19 24]]

#  etc

另一方面,如果整个数组需要为每个列移位一个新的副本,那就是时间流逝的地方,并且列是一个一个地打乱还是同时打乱并不重要,等

关于python - 在 numpy 矩阵中一次打乱一列的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26975807/

相关文章:

python - 使用 Python(ubuntu) 检测工作站/系统屏幕锁定

python - 检查容器中是否存在 NaN

python - 错误消息缺少必需的依赖项,导入错误 : Missing required dependencies ['numpy' ] when I try and freeze an executable

python - 列表输出中需要 float

python - 使用 Matplotlib 绘制数据子集

python - 如何根据其他字段提取csv文件某一字段的值?

python - swig 生成 python 文件加 C#

android - 高性能Web应用程序框架

C#:我应该使用 out 还是 ref 来取回这个结构?

javascript - 如何一次缩小多个 HTML/CSS 文件?