什么是洗牌与Python阵列的最简单的方法?

有帮助吗?

解决方案

import random
random.shuffle(array)

其他提示

import random
random.shuffle(array)

替代的方式来做到这一点使用 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”可以控制改组可重复的行为。

在其他的答案是最简单的,但它是一个有点恼人的是,random.shuffle方法实际上并不返回任何东西 - 它只是排序定列表。如果你想链来电或只能够在声明一行改组数组,你可以这样做:

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

然后可以执行线喜欢:

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

在定期Python列表处理,random.shuffle()将做的工作就像以前的答案显示。

但是,当它来ndarraynumpy.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.shufflenp.random.shuffle洗牌就地阵列。

以防万一你想要一个新的数组,你可以使用sample

import random
new_array = random.sample( array, len(array) )

您可以用排序随机密钥的阵列

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

但看起来random.shuffle(array)将更快,因为它用C写

在除了先前的答复,我想介绍另一功能。

numpy.random.shuffle以及random.shuffle执行就地改组。但是,如果你想返回一个混洗阵列numpy.random.permutation是使用功能。

我不知道我用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
# 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]
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top