Python列表没有正确附加排列值

时间:2018-03-04 22:57:47

标签: python numpy

我通过随机改组矩阵数组的行和列并将生成的混洗矩阵存储到python列表中来运行置换测试。我的想法是,我可以使用混洗矩阵进行所有其他排列测试(其他程序)。以下是突出显示问题的代码

#Debug the issues with permutation tests
import numpy as np
temp=[[0.11101831,0.444,0.555,0.6666],[.1,.2,.3,.4],[.10,.20,.30,.40],[.9,.8,.7,.6],[.4,.5,.6,.7]]
a=np.array(temp)
saved=[None for i in range(2)]
for i in range(2):
    np.random.shuffle(a)
    np.random.shuffle(a.T)
    saved[i]=a
    print ("-----------------------")
    print (a)
    print (saved)

这个输出如下:

[[ 0.3         0.2         0.1         0.4       ]
 [ 0.7         0.8         0.9         0.6       ]
 [ 0.3         0.2         0.1         0.4       ]
 [ 0.555       0.444       0.11101831  0.6666    ]
 [ 0.6         0.5         0.4         0.7       ]]
[array([[ 0.3       ,  0.2       ,  0.1       ,  0.4       ],
       [ 0.7       ,  0.8       ,  0.9       ,  0.6       ],
       [ 0.3       ,  0.2       ,  0.1       ,  0.4       ],
       [ 0.555     ,  0.444     ,  0.11101831,  0.6666    ],
       [ 0.6       ,  0.5       ,  0.4       ,  0.7       ]]), []]
[[ 0.3         0.2         0.4         0.1       ]
 [ 0.555       0.444       0.6666      0.11101831]
 [ 0.3         0.2         0.4         0.1       ]
 [ 0.6         0.5         0.7         0.4       ]
 [ 0.7         0.8         0.6         0.9       ]]
[array([[ 0.3       ,  0.2       ,  0.4       ,  0.1       ],
       [ 0.555     ,  0.444     ,  0.6666    ,  0.11101831],
       [ 0.3       ,  0.2       ,  0.4       ,  0.1       ],
       [ 0.6       ,  0.5       ,  0.7       ,  0.4       ],
       [ 0.7       ,  0.8       ,  0.6       ,  0.9       ]]), array([[ 0.3       ,  0.2       ,  0.4       ,  0.1       ],
       [ 0.555     ,  0.444     ,  0.6666    ,  0.11101831],
       [ 0.3       ,  0.2       ,  0.4       ,  0.1       ],
       [ 0.6       ,  0.5       ,  0.7       ,  0.4       ],
       [ 0.7       ,  0.8       ,  0.6       ,  0.9       ]])]

正如您所看到的,对于i = 0,shuffle矩阵a的值和列表的第一个索引(已保存)是相同的。但是当i = 1时,保存[0]和保存[1]都变得相同。这不应该发生,因为我使用列表的索引来分配混洗矩阵。这里有什么我想念的吗?

2 个答案:

答案 0 :(得分:1)

您需要copy数组,而不仅仅是参考。

在上面的代码中,saved[i]=a为所有a引用相同的数组i

将其更改为saved[i]=np.copy(a)

答案 1 :(得分:1)

np.random.shuffle是就地操作,因此您需要使用副本as explained by @liliscent;或者,我的偏好,只是使用一个不能正常运作的功能。

np.random.permutation足以完成您的任务:

import numpy as np

a = np.array([[0.11101831,0.444,0.555,0.6666],
             [.1,.2,.3,.4],
             [.10,.20,.30,.40],
             [.9,.8,.7,.6],
             [.4,.5,.6,.7]])

saved = []

for i in range(2):
    x = np.random.permutation(np.random.permutation(a).T)
    saved.append(x)

更好的是,您可以将其转换为列表理解:

saved = [np.random.permutation(np.random.permutation(a).T) for _ in range(2)]

示例结果:

# [array([[ 0.8       ,  0.444     ,  0.5       ,  0.2       ,  0.2       ],
#        [ 0.9       ,  0.11101831,  0.4       ,  0.1       ,  0.1       ],
#        [ 0.7       ,  0.555     ,  0.6       ,  0.3       ,  0.3       ],
#        [ 0.6       ,  0.6666    ,  0.7       ,  0.4       ,  0.4       ]]),
#  array([[ 0.4       ,  0.11101831,  0.1       ,  0.9       ,  0.1       ],
#        [ 0.6       ,  0.555     ,  0.3       ,  0.7       ,  0.3       ],
#        [ 0.7       ,  0.6666    ,  0.4       ,  0.6       ,  0.4       ],
#        [ 0.5       ,  0.444     ,  0.2       ,  0.8       ,  0.2       ]])]