使用 python 打乱数组顺序,使用 python 随机化数组项顺序
- 2025-03-04 08:24:00
- admin 原创
- 99
问题描述:
使用 python 来随机排列数组的最简单方法是什么?
解决方案 1:
import random
random.shuffle(array)
解决方案 2:
import random
random.shuffle(array)
解决方案 3:
使用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”可以控制改组以实现可重现的行为。
解决方案 4:
如果你想要一个新数组,你可以使用sample
:
import random
new_array = random.sample( array, len(array) )
解决方案 5:
其他答案是最简单的,但是该random.shuffle
方法实际上不返回任何内容,这有点烦人 - 它只是对给定的列表进行排序。如果您想链接调用或只是能够在一行中声明一个随机数组,您可以这样做:
import random
def my_shuffle(array):
random.shuffle(array)
return array
然后你可以这样做:
for suit in my_shuffle(['hearts', 'spades', 'clubs', 'diamonds']):
解决方案 6:
当处理常规 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
就地对数组进行打乱。
解决方案 7:
你可以用随机键对数组进行排序
sorted(array, key = lambda x: random.random())
键仅被读取一次,因此排序时比较项目仍然有效。
但看起来random.shuffle(array)
会更快,因为它是用 C 编写的
顺便说一下,这是 O(Nlog(N))
解决方案 8:
除了前面的回复之外,我还想介绍另一个功能。
numpy.random.shuffle
以及random.shuffle
执行就地改组。但是,如果您想返回改组后的数组,numpy.random.permutation
则可以使用该函数。
解决方案 9:
我不知道我用过,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
解决方案 10:
请注意,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。
如果我们对多维数组使用正确的 shuffle 函数,即np.random.shuffle(x)
,数组将按预期沿第一个轴进行 shuffle。但是,使用random.shuffle(x)
会导致重复。你可以在 shuffle 之后运行来检查这一点,使用 时len(np.unique(x))
会得到 10(如预期的那样),np.random.shuffle()
但使用 时只会得到 5 左右random.shuffle()
。
解决方案 11:
# 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]
扫码咨询,免费领取项目管理大礼包!