使用np.random.shuffle()在循环内追加到列表的问题

时间:2018-10-02 15:39:20

标签: python loops append shuffle

我陷入下面的代码中,在这里我希望对列表进行随机播放所需的次数,然后在循环内将结果存储在某个位置。我可以看到在循环内正确执行了改组,但是我无法获得存储在列表中的相同结果。

import pandas as pd
import numpy as np
from scipy import stats
class shuffle():
     def __init__(self,arr,i):
         new=[]                                                                                                                                                 
         for ii in range(i):                 
             np.random.shuffle(arr)
             print arr
             new.append(arr)             
         self.new2 = np.asarray(new)
     def f():
         #print self.new2
         return self.new2

a = np.linspace(1,4,10)
s=shuffle(a,3)     

输入'a'是

[1.        , 1.33333333, 1.66666667, 2.        , 2.33333333,
       2.66666667, 3.        , 3.33333333, 3.66666667, 4.        ])  

该类内部的打印输出(改组3次)给出:

print arr

[2.         1.66666667 4.         1.         3.33333333 2.33333333
 3.66666667 1.33333333 3.         2.66666667]
[2.33333333 2.         1.33333333 1.66666667 3.66666667 1.
 3.33333333 3.         2.66666667 4.        ]
[2.         3.66666667 2.33333333 4.         1.66666667 1.33333333
 3.         3.33333333 2.66666667 1.        ]

但是数组输出'new2'给出了以下结果,而不是上面的预期输出:

s.new2
Out[15]: 
array([[2.        , 3.66666667, 4.        , 3.33333333, 2.33333333,
        2.66666667, 1.        , 1.33333333, 3.        , 1.66666667],
       [2.        , 3.66666667, 4.        , 3.33333333, 2.33333333,
        2.66666667, 1.        , 1.33333333, 3.        , 1.66666667],
       [2.        , 3.66666667, 4.        , 3.33333333, 2.33333333,
        2.66666667, 1.        , 1.33333333, 3.        , 1.66666667]])

2 个答案:

答案 0 :(得分:4)

正如您所提到的,np.random.shuffle将就地修改数组。由于您将数组本身(实际上是对数组的引用)附加到close列表中,因此最后它包含对同一数组的三个引用(包含上次改组的值)。尝试打印if (coinCount.contains("Cashout")) { // rest of the code } 以说服自己。相反,您可以通过coinCount附加副本。

答案 1 :(得分:0)

这就是解决方案,这要感谢@a_guest的回答

class shuffle():
    ...:      def __init__(self,arr,i):
    ...:          new=[]                                                                                                                                         
    ...:         
    ...:          for ii in range(i):                 
    ...:              arr2=arr.copy()
    ...:              np.random.shuffle(arr2)
    ...:              print arr2
    ...:              new.append(arr2)             
    ...:          self.new2 = np.asarray(new)
    ...:      def f():
    ...:          #print self.new2
    ...:          return self.new2

现在的输出符合预期:

s.new2
Out[34]: 
array([[3.        , 1.        , 3.66666667, 2.66666667, 1.66666667,
        2.33333333, 1.33333333, 4.        , 2.        , 3.33333333],
       [4.        , 3.66666667, 3.        , 2.33333333, 1.66666667,
        1.33333333, 2.66666667, 1.        , 3.33333333, 2.        ],
       [2.        , 3.        , 2.33333333, 4.        , 3.33333333,
        1.        , 1.66666667, 1.33333333, 2.66666667, 3.66666667]])