Python Numpy random.shuffle() 随机排列

在实际开发中,我们经常需要对数据进行 随机打乱,例如:打乱训练数据顺序、随机抽样前先洗牌、生成随机排列序列,本文主要介绍 Python NumPy 中用于 随机排列 的两个常用方法:shuffle()、permutation()

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

这时它会返回:

0n-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)

推荐阅读
cjavapy编程之路首页