使用python随机播放数组,使用python随机化数组项顺序

dav*_*gr8 241 python arrays random shuffle

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

Dav*_*d Z 440

import random
random.shuffle(array)
Run Code Online (Sandbox Code Playgroud)

  • 具有讽刺意味的是,当我刚刚搜索"python shuffle array"时,这个页面在Google中名列前茅 (12认同)
  • 是否有一个选项不会改变原始数组但返回一个新的混洗数组? (2认同)
  • @Charlie人谷歌这些问题,以便他们可以在堆栈溢出等地方找到答案.只要不是重复,将堆栈溢出作为资源选项就没有错 (2认同)

Dou*_*der 107

import random
random.shuffle(array)
Run Code Online (Sandbox Code Playgroud)

  • 有没有不改变原始数组但返回一个新的混洗数组的选项? (2认同)

Qy *_*Zuo 32

使用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)
Run Code Online (Sandbox Code Playgroud)

输出:

[2, 1, 3]
['two', 'one', 'three']
Run Code Online (Sandbox Code Playgroud)

优点:您可以在不中断映射的情况下同时随机连接多个阵列.并且'random_state'可以控制混洗以获得可重现的行为.

  • 谢谢,一次打乱两个数组非常有用。 (2认同)
  • 比接受的答案更完整(并且通常更有用) (2认同)

Mar*_*des 21

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

    import random
    def my_shuffle(array):
        random.shuffle(array)
        return array
Run Code Online (Sandbox Code Playgroud)

然后你可以做如下行:

    for suit in my_shuffle(['hearts', 'spades', 'clubs', 'diamonds']):
Run Code Online (Sandbox Code Playgroud)

  • Python实际上并不旨在尽可能简短.Python旨在平衡可读性和表达性.它恰好相当简短,主要是因为它是一种非常高级的语言.Python自己的内置函数*通常*(并非总是)努力*要么*是"函数式"(返回一个值,但没有副作用)*或*是"过程式"(通过副作用操作,并且不要什么都没有).这与Python在语句和表达式之间非常严格的区分密切相关. (12认同)
  • 它没有返回*具体*,因为它试图通过改变输入来提醒你它的工作原理.(这可以节省内存.)您的功能也可以改变其输入. (7认同)
  • 我想这是一种风格的东西.就个人而言,我更喜欢这样一个事实,即我可以写一行来实现其他方式.对我来说似乎很奇怪,一种旨在让程序尽可能短的语言在这些情况下不会返回传递的对象.由于它改变了输入,你可以替换对random.shuffle的调用来调用这个版本而不会出现问题. (2认同)

Shu*_*ang 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
Run Code Online (Sandbox Code Playgroud)

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

就像random.shuffle,np.random.shuffle就地将阵列洗牌一样.

  • 毁灭的意思究竟是什么意思?(我的意思是,在这种情况下 - 我不是ELL.) (2认同)

Cha*_*ker 10

如果你想要一个新阵列,你可以使用sample:

import random
new_array = random.sample( array, len(array) )
Run Code Online (Sandbox Code Playgroud)


Tri*_*Nhu 6

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

sorted(array, key = lambda x: random.random())
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 虽然您的代码可能作为答案正确,但详细说明您的代码的作用,它可以提高您的答案的质量。查看文章:[如何写出好的答案?](https://stackoverflow.com/help/how-to-answer) (2认同)

Sab*_*ber 5

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

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