我通过随机改组矩阵数组的行和列并将生成的混洗矩阵存储到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]都变得相同。这不应该发生,因为我使用列表的索引来分配混洗矩阵。这里有什么我想念的吗?
答案 0 :(得分:1)
答案 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 ]])]