繁体   English   中英

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

[英]Problem appending to a list inside a loop using np.random.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]])

如前所述, np.random.shufflenp.random.shuffle修改数组。 由于您将数组本身(实际上是对数组的引用)附加到new列表中,因此最后它包含对同一数组的三个引用(包含上次改组的值)。 尝试[id(x) for x in s.new2]打印[id(x) for x in s.new2]以说服自己。 相反,您可以通过new.append(arr.copy())附加副本。

这就是解决方案,这要感谢@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]])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM