【问题标题】:Strange behaviour when using random.shuffle on numpy.array在 numpy.array 上使用 random.shuffle 时的奇怪行为
【发布时间】:2015-09-18 04:25:20
【问题描述】:
import numpy as np
from random import shuffle

a = np.array([[1,2,3],[4,5,6]])
print(a)
for i in range(1000):
    shuffle(a)
print(a)

输出:

[[1 2 3]
 [4 5 6]]
[[1 2 3]
 [1 2 3]]

获取两个[1, 2, 3][4, 5, 6] 不见了。

import numpy as np
from random import shuffle

a = np.arange(10).reshape(5,2)
print(a)
for i in range(1000):
    shuffle(a)
print(a)

输出:

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

数组中的所有项都成为第一项。

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    出现基本问题是因为random.shuffle使用如下(代码可以找到here)-

    x[i], x[j] = x[j], x[i]
    

    如果你对 Numpy 数组进行这种赋值(就像你的情况一样),你就会遇到问题 -

    In [41]: ll
    Out[41]:
    array([[7, 8],
           [5, 6],
           [1, 2],
           [3, 4]])
    
    In [42]: ll[0] , ll[1] = ll[1] , ll[0]
    
    In [43]: ll
    Out[43]:
    array([[5, 6],
           [5, 6],
           [1, 2],
           [3, 4]])
    

    下面的例子或许能说明问题发生的原因——

    In [63]: ll = np.array([[1,2],[3,4],[5,6],[7,8]])
    
    In [64]: ll[0]
    Out[64]: array([1, 2])
    
    In [65]: x = ll[0]
    
    In [66]: x
    Out[66]: array([1, 2])
    
    In [67]: y = ll[1]
    
    In [68]: y
    Out[68]: array([3, 4])
    
    In [69]: ll[1] = x
    
    In [70]: y
    Out[70]: array([1, 2])
    

    正如您所看到的,当您将 ll[1] 设置为新值时,y 变量也反映了更改,这很可能是因为 numpy 可能正在原地变异 ll[1](请注意,我不是在谈论llll[1] 内部 ndarrayll )而不是将 x 引用的对象分配给 ll[1] (就像它发生在列表的情况下)。


    作为一种解决方案,您可以使用np.random.shuffle() 而不是random.shuffle() -

    In [71]: ll = np.array([[1,2],[3,4],[5,6],[7,8]])
    
    In [72]: ll
    Out[72]:
    array([[1, 2],
           [3, 4],
           [5, 6],
           [7, 8]])
    
    In [73]: from numpy.random import shuffle
    
    In [74]: shuffle(ll)
    
    In [75]: ll
    Out[75]:
    array([[7, 8],
           [3, 4],
           [1, 2],
           [5, 6]])
    

    请注意,np.random.shuffle() 仅沿多维数组的第一个索引随机排列元素。 (虽然如果random.shuffle() 有效,它也会这样工作)。

    【讨论】:

      【解决方案2】:

      numpy.random.shuffle(a) 应该做你想做的。在终端上玩弄 random.shuffle ,它似乎不能很好地处理矩阵。

      Shuffle a numpy array

      【讨论】:

        猜你喜欢
        • 2015-05-29
        • 2020-12-11
        • 1970-01-01
        • 2014-10-13
        • 1970-01-01
        • 2018-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多