洗牌与Python阵列,蟒随机数组项顺序
题
什么是洗牌与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()
将做的工作就像以前的答案显示。
但是,当它来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
洗牌就地阵列。
以防万一你想要一个新的数组,你可以使用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]
不隶属于 StackOverflow