用python洗牌数组最简单的方法是什么?
当前回答
# 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'可以控制可复制行为的变换。
# 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]
当处理常规的Python列表时,random.shuffle()将完成工作,就像前面的答案所显示的那样。
但当涉及到ndarray(numpy.array)时,随机。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)
像随机的。Shuffle, np.random.shuffle原地打乱数组。
其他的答案是最简单的,但它是有点烦人的随机。Shuffle方法实际上并不返回任何东西——它只是对给定的列表进行排序。如果你想链式调用,或者只是能够在一行中声明一个洗牌数组,你可以这样做:
import random
def my_shuffle(array):
random.shuffle(array)
return array
然后你可以这样做:
for suit in my_shuffle(['hearts', 'spades', 'clubs', 'diamonds']):
import random
random.shuffle(array)