319

用 python 打乱数组的最简单方法是什么?

4

11 回答 11

567
import random
random.shuffle(array)
于 2009-01-23T18:37:27.630 回答
111
import random
random.shuffle(array)
于 2009-01-23T18:38:14.663 回答
44

使用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”可以控制可再现行为的改组。

于 2017-07-24T03:30:35.220 回答
21

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

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

然后您可以执行以下操作:

    for suit in my_shuffle(['hearts', 'spades', 'clubs', 'diamonds']):
于 2011-12-20T22:05:30.333 回答
19

万一您想要一个新数组,您可以使用sample

import random
new_array = random.sample( array, len(array) )
于 2017-03-29T18:37:02.850 回答
12

在处理常规 Python 列表时,random.shuffle()将像前面的答案所示那样完成工作。

但说到ndarray( numpy.array),random.shuffle似乎打破了原来的ndarray. 这是一个例子:

import random
import numpy as np
import numpy.random

a = np.array([1,2,3,4,5,6])
a.shape = (3,2)
print a
random.shuffle(a) # a will definitely be destroyed
print a

只需使用:np.random.shuffle(a)

random.shuffle,np.random.shuffle就地打乱数组。

于 2013-10-28T09:23:27.887 回答
8

您可以使用随机键对数组进行排序

sorted(array, key = lambda x: random.random())

键只被读取一次,因此在排序期间比较项目仍然有效。

但看起来random.shuffle(array)会更快,因为它是用 C 编写的

这是 O(log(N)) 顺便说一句

于 2018-09-21T18:37:26.350 回答
4

除了前面的回复,我想介绍另一个功能。

numpy.random.shuffle以及random.shuffle执行就地洗牌。但是,如果你想返回一个混洗数组numpy.random.permutation是要使用的函数。

于 2016-11-18T09:55:16.463 回答
2

我不知道我用过random.shuffle(),但它返回“无”给我,所以我写了这个,可能对某人有帮助

def shuffle(arr):
    for n in range(len(arr) - 1):
        rnd = random.randint(0, (len(arr) - 1))
        val1 = arr[rnd]
        val2 = arr[rnd - 1]

        arr[rnd - 1] = val1
        arr[rnd] = val2

    return arr
于 2017-01-17T11:09:47.937 回答
0
# 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]
于 2018-11-14T15:41:58.470 回答
0

请注意,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))这会给您 10(如预期的那样),np.random.shuffle()但在使用random.shuffle().

于 2020-02-21T14:01:37.643 回答