NumPy - 排列和重排
什么是排列和重排?
排列和重排是用于以随机顺序重新排列数组元素的技术。重排会就地修改数组,而排列则会创建一个元素重新排列的新数组。
这些操作对于数据增强、引导程序和测试算法的鲁棒性等任务非常有用。
使用 NumPy 重排数组
NumPy 提供了 numpy.random.shuffle() 函数来就地重排数组元素。这意味着原始数组被修改,元素被随机重新排列。
示例
如下例所示,数组元素被原地打乱,这意味着原始数组被修改,元素被随机重新排列 -
import numpy as np # 定义一个数组 array = np.array([1, 2, 3, 4, 5]) # 原地打乱数组 np.random.shuffle(array) print("打乱后的数组:", array)
以下是得到的输出 -
打乱后的数组:[1 2 5 4 3]
使用NumPy
与混洗不同,排列会创建一个新数组,其中元素随机重新排列,而不会修改原始数组。 NumPy 提供了 numpy.random.permutation() 函数来生成排列。
示例
以下示例中,原始数组保持不变,并生成一个元素随机重新排列的新数组 -
import numpy as np # 定义一个数组 array = np.array([1, 2, 3, 4, 5]) # 生成数组的排列 permuted_array = np.random.permutation(array) print("原始数组:", array) print("排列后的数组:", permuted_array)
结果如下 -
原始数组:[1 2 3 4 5] 置换数组:[4 2 5 1 3]
对多维数组进行混排
NumPy 还支持对多维数组进行混排。对多维数组进行随机打乱时,只有第一个轴会被随机打乱。
示例
在此示例中,只有二维数组的行会被随机打乱,而每行中的元素仍保持其原始顺序 -
import numpy as np # 定义一个二维数组 array_2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 原地随机打乱数组 np.random.shuffle(array_2d) print("随机打乱后的二维数组:", array_2d)
以下是上述代码的输出 -
随机打乱后的二维数组: [[4 5 6] [1 2 3] [7 8 9]]
置换多维数组
与重排类似,您可以生成多维数组的置换。使用 numpy.random.permutation() 函数时,数组会被展平、置换,然后重新整形回其原始维度。
示例
在此示例中,二维数组的行被置换,从而创建一个新的数组,其中的行以不同的顺序重新排列 -
import numpy as np # 定义一个二维数组 array_2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 生成二维数组的置换 permuted_array_2d = np.random.permutation(array_2d) print("原始二维数组:", array_2d) print("置换后的二维数组:", permuted_array_2d)
输出结果如下 -
原始二维数组: [[1 2 3] [4 5 6] [7 8 9]] 置换后的二维数组: [[1 2 3] [4 5 6] [7 8 9]]
整数的随机排列
NumPy 还可以使用 numpy.random.permutation() 函数生成一系列整数的随机排列。这对于创建随机整数序列非常有用。
示例
以下示例使用 numpy.random.permutation() 函数生成从 0 到 9 的整数随机排列 -
import numpy as np # 生成从 0 到 9 的整数随机排列 random_permutation = np.random.permutation(10) print("从 0 到 9 的整数随机排列:", random_permutation)
以下是获得的输出 -
从 0 到 9 的整数随机排列:[2 8 1 3 4 0 6 7 5 9]
使用特定种子进行混洗
为了确保可重复性,您可以在混洗或生成排列之前设置特定的种子。这样可以确保每次运行代码时都会生成相同的随机数序列。
示例
通过设置种子,可以确保每次执行代码时随机打乱的结果都相同,如下例所示 -
import numpy as np # 设置种子以确保可重复性 np.random.seed(42) # 定义一个数组 array = np.array([1, 2, 3, 4, 5]) # 原地打乱数组 np.random.shuffle(array) print("使用种子 42 打乱后的数组:", array) # 重置种子并再次打乱以获得相同的结果结果 np.random.seed(42) np.random.shuffle(array) print("再次使用种子 42 进行随机打乱的数组:", array)
输出结果如下:-
使用种子 42 进行随机打乱的数组:[2 5 3 1 4] 使用种子 42 进行随机打乱的数组(再次使用种子 42):[5 4 3 2 1]
数据拆分的随机打乱和排列
在机器学习中,随机打乱和排列通常用于将数据集拆分为训练集和测试集。通过随机打乱数据,可以确保训练集和测试集能够代表整个数据集。
示例
在此示例中,数据集被随机打乱,然后拆分为训练集和测试集。这有助于确保训练集和测试集随机分布,并代表整个数据集 -
import numpy as np # 定义数据集 dataset = np.array([[1, 'A'], [2, 'B'], [3, 'C'], [4, 'D'], [5, 'E']]) # 原地打乱数据集 np.random.shuffle(dataset) print("打乱后的数据集:", dataset) # 将数据集拆分为训练集和测试集 train_set = dataset[:3] test_set = dataset[3:] print("训练集:", train_set) print("测试集:", test_set)
以下是获得的输出 -
打乱后的数据集: [['5' 'E'] ['4' 'D'] ['2' 'B'] ['1' 'A'] ['3' 'C']] 训练集: [['5' 'E'] ['4' 'D'] ['2' 'B']] 测试集: [['1' 'A'] ['3' 'C']]