用python洗牌数组最简单的方法是什么?


当前回答

注意random.shuffle()不应该用于多维数组,因为它会导致重复。

假设你想要沿着数组的第一个维度洗牌,我们可以创建以下测试示例,

import numpy as np
x = np.zeros((10, 2, 3))

for i in range(10):
   x[i, ...] = i*np.ones((2,3))

沿着第一个轴,第i个元素对应于一个2x3矩阵其中所有的元素都等于i。

如果我们对多维数组使用正确的洗牌函数,即np.random.shuffle(x),数组将按照需要沿着第一个轴洗牌。但是,使用random.shuffle(x)将导致重复。你可以在洗牌后运行len(np.unique(x))来检查这一点,使用np.random.shuffle()会得到10(正如预期的那样),但使用random.shuffle()时只有5左右。

其他回答

其他的答案是最简单的,但它是有点烦人的随机。Shuffle方法实际上并不返回任何东西——它只是对给定的列表进行排序。如果你想链式调用,或者只是能够在一行中声明一个洗牌数组,你可以这样做:

    import random
    def my_shuffle(array):
        random.shuffle(array)
        return array

然后你可以这样做:

    for suit in my_shuffle(['hearts', 'spades', 'clubs', 'diamonds']):

注意random.shuffle()不应该用于多维数组,因为它会导致重复。

假设你想要沿着数组的第一个维度洗牌,我们可以创建以下测试示例,

import numpy as np
x = np.zeros((10, 2, 3))

for i in range(10):
   x[i, ...] = i*np.ones((2,3))

沿着第一个轴,第i个元素对应于一个2x3矩阵其中所有的元素都等于i。

如果我们对多维数组使用正确的洗牌函数,即np.random.shuffle(x),数组将按照需要沿着第一个轴洗牌。但是,使用random.shuffle(x)将导致重复。你可以在洗牌后运行len(np.unique(x))来检查这一点,使用np.random.shuffle()会得到10(正如预期的那样),但使用random.shuffle()时只有5左右。

import random
random.shuffle(array)
# arr = numpy array to shuffle

def shuffle(arr):
    a = numpy.arange(len(arr))
    b = numpy.empty(1)
    for i in range(len(arr)):
        sel = numpy.random.random_integers(0, high=len(a)-1, size=1)
        b = numpy.append(b, a[sel])
        a = numpy.delete(a, sel)
    b = b[1:].astype(int)
    return arr[b]

另一种方法是使用sklearn

from sklearn.utils import shuffle
X=[1,2,3]
y = ['one', 'two', 'three']
X, y = shuffle(X, y, random_state=0)
print(X)
print(y)

输出:

[2, 1, 3]
['two', 'one', 'three']

优点:可以同时随机多个数组,而不会中断映射。'random_state'可以控制可复制行为的变换。