HOWTO · NumPy
NumPy 中的 numpy.random.permutation() 函数
numpy.random.permutation() 函数返回一个数组的随机排列副本,或者在传入整数时返回一个排列过的整数范围,并保持原始数据不变——这与就地打乱数组的 numpy.random.shuffle() 不同。
本页内容
numpy.random.permutation() 随机排列一个序列,或返回一个排列过的范围。向它传入一个数组,它会返回该数组的一个打乱了的副本——原始数组保持原样。向它传入一个整数 n,它会以随机顺序返回从 0 到 n - 1 的整数。这种复制而非修改的行为,正是它与就地打乱数组的 numpy.random.shuffle() 的全部区别。
在不改变原始数组的情况下进行排列
对于数组,permutation() 会构建一个包含相同元素、但顺序随机的新数组:
import numpy as np
original_array = np.array([1, 2, 3, 4, 5])
shuffled_array = np.random.permutation(original_array)
print("Original Array:", original_array)
print("Shuffled Array:", shuffled_array)
输出:
Original Array: [1 2 3 4 5]
Shuffled Array: [3 1 5 2 4]
shuffled_array 中的顺序是随机的,所以上面的输出只是一个可能的结果,而不是每次执行都会产生的结果。不变的是 original_array:它仍然保存着 [1 2 3 4 5],这正是当原始顺序在后续仍然重要时——例如,当一个数据集必须与其标签保持对齐时——permutation() 成为正确选择的原因。
对于整数,permutation() 返回一个排列过的范围,这是获取随机索引的一种方便方法:
import numpy as np
n = 5
permuted_indices = np.random.permutation(n)
print("Permuted Indices:", permuted_indices)
输出:
Permuted Indices: [4 0 2 3 1]
同样,确切的顺序在每次执行时都会有所不同。传入一个整数等价于先用 np.arange(n) 构建范围,然后对该数组进行排列。
比较 permutation() 与 shuffle()
这两个函数的区别在于它们返回什么,以及它们对你的数据做了什么。permutation() 返回一个新数组,并且从不触碰它的输入。numpy.random.shuffle() 什么都不返回,而是就地重新排列数组本身:
import numpy as np
original_array = np.array([1, 2, 3, 4, 5])
np.random.shuffle(original_array)
print("Shuffled Original Array:", original_array)
输出:
Shuffled Original Array: [2 5 1 4 3]
在此调用之后,原始顺序就消失了。当你不需要原始顺序并想就地重新排列时,选择 shuffle();当原始数组必须保留时,选择 permutation()。复制带来的一个实际影响是:在大型数据集上,permutation() 需要为第二个数组准备内存,所以当数据很大时,要在这种便利与额外的内存之间权衡。