使用 python 打乱数组,使用 python 随机化数组项顺序

问题描述 投票:0回答:11

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

python arrays random shuffle
11个回答
622
投票
import random
random.shuffle(array)

118
投票
import random
random.shuffle(array)

54
投票

使用 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”可以控制可重现行为的洗牌。


28
投票

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

sample

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

20
投票

其他答案是最简单的,但是有点烦人的是

random.shuffle
方法实际上并不返回任何内容 - 它只是对给定列表进行排序。如果你想链式调用或者只是能够在一行中声明一个打乱的数组,你可以这样做:

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

然后你可以这样做:

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

15
投票

处理常规 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
会原地打乱数组。


8
投票

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

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

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

但是看起来

random.shuffle(array)
会更快,因为它是用C写的

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


5
投票

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

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


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

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))
来检查这一点,使用
np.random.shuffle()
可以得到 10(如预期),但使用
random.shuffle()
时只能得到 5 左右。


-1
投票
# 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]
© www.soinside.com 2019 - 2024. All rights reserved.