1、什么是元素的随机排列?
排列(Permutation) 指的是:
一组元素在顺序上的重新组合
例如:
[1, 2, 3][3, 2, 1][2, 1, 3]
这些都是同一组元素的不同排列。
如果这种排列是通过随机方式生成的,就称为 随机排列。
NumPy 的 random 模块为此提供了两个常用方法:
shuffle():就地打乱permutation():返回新的随机排列结果
2、shuffle():乱序排列
shuffle() 的作用是:
直接打乱原数组中元素的顺序
也就是说,它会 原地修改(in-place) 数组本身,而不会返回一个新的重排数组。
示例:随机打乱一维数组
from numpy import random import numpy as np arr=np.array([1, 2, 3, 4, 5]) random.shuffle(arr) print(arr)
输出结果示例:
[3 5 1 4 2]
每次运行结果通常不同。
说明
shuffle() 的特点:
- 会修改原数组
- 不返回新数组
- 适合希望直接改变原数据顺序的场景
可以理解为:
把原数组“洗牌”了
3、permutation():生成数组的随机排列
与 shuffle() 不同,permutation() 的作用是:
返回一个重新排列后的新数组,而原数组保持不变
示例:生成数组的随机排列
from numpy import random import numpy as np arr=np.array([1, 2, 3, 4, 5]) print(random.permutation(arr)) print(arr)
输出结果示例:
[4 1 5 2 3] [1 2 3 4 5]
说明:
- 第一行是重新排列后的新数组
- 第二行是原数组,未发生变化
4、shuffle() 与 permutation() 的区别
这是本节最重要的内容。
| 方法 | 是否修改原数组 | 是否返回新数组 |
|---|---|---|
shuffle() | 是 | 否 |
permutation() | 否 | 是 |
一句话记忆
shuffle():原地打乱permutation():返回副本
5、二维数组中的行为说明
当数组是二维时,shuffle() 默认只会沿 第 1 个轴 打乱,也就是:
打乱行的顺序,而不是行内元素的顺序
示例:打乱二维数组
from numpy import random
import numpy as np
arr=np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
random.shuffle(arr)
print(arr)输出结果示例:
[[7 8 9]
[1 2 3]
[4 5 6]]
说明:
- 每一行内部顺序保持不变
- 只是行的位置发生了变化
permutation() 处理二维数组
from numpy import random
import numpy as np
arr=np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
new_arr=random.permutation(arr)
print(new_arr)
print(arr)
说明:
- 返回的是打乱行顺序后的新数组
- 原数组不变
6、生成整数范围的随机排列
permutation() 不仅可以接收数组,还可以接收整数 n。
这时它会返回:
0到n-1的一个随机排列
示例
from numpy import random
print(random.permutation(5))
输出结果示例:
[2 0 4 1 3]
说明:
这表示对序列 [0, 1, 2, 3, 4] 进行了随机排列。
7、常见应用场景
使用 shuffle() 的场景
适合直接打乱原数组,例如:
- 打乱训练样本顺序
- 洗牌操作
- 不再需要保留原始顺序
使用 permutation() 的场景
适合既想得到乱序结果,又想保留原数据,例如:
- 对比实验
- 生成随机索引
- 原数据不能被修改
8、一个常见提醒
如写的是:
arr2=random.shuffle(arr)
那么 arr2 的结果会是:
None
因为 shuffle() 是 原地修改,并不会返回新的数组。
正确用法是:
random.shuffle(arr)
print(arr)
如需要新数组,应使用:
arr2=random.permutation(arr)