如何在Python中对两个数组进行统一洗牌?

113 阅读3分钟

问题的提出

给出两个长度相同但顺序不同的数组。你将如何对这两个数组进行统一的洗牌?

对两个数组进行统一洗牌意味着以相同的模式对两个数组的元素重新排序。让我们借助于一个例子来理解这个问题。

例子

Given:

arr_1 = [[1, 1], [2, 2], [3, 3]]

arr_2 = [1, 2, 3]

Expected Output (After shuffling them in unison):

arr_1_shuffled:

[[3 3] [1 1] [2 2]]

arr_2_shuffled:

[3 1 2]





因此,在本教程中,你将学习到解决统一洗刷两个给定数组这一关键问题的不同方法。因此,不再拖延,让我们深入了解这些解决方案。

⚡方法1: 使用numpy.random.permutation

方法。调 用numpy.random模块的permutation() ,并将给定数组的长度传递给该函数。这将返回一个随机的permutation范围:0len(array)-1 。假设结果被存储在一个变量shuffler 。然后,用方括号符号表示为。

  • arr_1_shuffled = arr_1[shuffler] 。
  • arr_2_shuffled = arr_2[shuffler] 。

这样,你就可以根据shuffler 的值来洗刷这两个数组。

代码

import numpy as np
# Given
arr_1 = np.array([[1, 1], [2, 2], [3, 3]])
arr_2 = np.array([1, 2, 3])
# shuffling the two arrays in unison
shuffler = np.random.permutation(len(arr_1))
arr_1_shuffled = arr_1[shuffler]
arr_2_shuffled = arr_2[shuffler]
print(arr_1_shuffled)
print(arr_2_shuffled)

输出

[[3 3]
 [1 1]
 [2 2]]
[3 1 2]

注意:用通俗的话说,排列意味着元素的排列。所以,[30,20,10]是[10,20,30]的一个排列,反之亦然。numpy.random模块的permutation() 方法返回一个重新排列的数组,同时保持原数组不变。上面的解决方案仅仅是这个函数的一个使用案例。

⚡方法2:使用sklearn.utils.shuffle()

另一种处理给定问题的方法是使用sklearn.utils 模块中的shuflle() 方法。shuffle方法允许你以一致的方式对数组和稀疏矩阵进行洗牌。你可以把两个数组作为sklearn.utils.shuffle(arr_1, arr_2) ,它对它们进行一致的洗牌,然后返回每个数组的洗牌副本。

代码

import sklearn
import numpy as np
# Given
arr_1 = np.array([[1, 1], [2, 2], [3, 3]])
arr_2 = np.array([1, 2, 3])
# shuffling the two arrays in unison
arr_1_shuffled, arr_2_shuffled = sklearn.utils.shuffle(arr_1, arr_2)
print(arr_1_shuffled)
print(arr_2_shuffled)

输出

[[3 3]
 [2 2]
 [1 1]]
[3 2 1]

⚡方法3:使用numpy.random.shuffle

另一个类似的函数是numpy.random 模块中的shuffle方法,它可以帮助你洗掉给定的数组。它将一个序列作为输入,并对其中的元素进行洗牌,以返回原始序列的一个重新排列的版本。请注意,shuffle方法会改变原始序列本身。

方法

  • 使用np.arange(len(arr_1)) ,创建一个包含0到len(array)-1范围内元素的数组。在这种情况下,创建的数组将是[0 1 2]。
  • 现在使用shuffle方法对上述数组进行洗牌,重新排列数组中的元素。比方说,洗完上述数组后,看起来如下。[2 1 0].现在可以用这个数组作为索引来洗刷两个数组。

代码

import numpy as np
# Given
arr_1 = np.array([[1, 1], [2, 2], [3, 3]])
arr_2 = np.array([1, 2, 3])
# shuffling the two arrays in unison
shuffled = np.arange(len(arr_1))
np.random.shuffle(shuffled)
print(arr_1[shuffled])
print(arr_2[shuffled])

输出

[[3 3]
 [2 2]
 [1 1]]
[3 2 1]

🧨编码挑战

在我们结束之前,这里有一个编码挑战,供你磨练你的编码技巧。

给出一个由2n个元素组成的数组nums ,其形式为**[x1, x2,..., xn, y1, y2,..., yn**]。

返回数组的形式为**[x1, y1, x2, y2,..., xn,**yn]。

限制条件

  1. 1 <= n <= 500
  2. nums.length == 2n
  3. 1 <= nums[i] <= 10^3

例子:
输入:nums = [2, 5, 1, 3, 4, 7], n = 3

输出 :[2, 3, 5, 4, 1, 7]
解释:
由于x1=2, x2=5, x3=1, y1=3, y2=4, y3=7,所以答案是[2, 3, 5, 4, 1, 7]。

在你看到这个答案之前,强烈建议你自己尝试解决这个问题。

解决方案

def shuffle_array(nums, n):
    shuffled = []
    for i in range(n):
        shuffled.append(nums[i])
        shuffled.append(nums[i + n])
    return shuffled


nums = [2, 5, 1, 3, 4, 7]
n = 3
print(shuffle_array(nums, n))

总结

在本教程中,我们学习了三种不同的洗牌方式,将两个给定的数组统一洗牌。我希望这对你有所帮助。