python 中子数组的排列

Permutations over subarray in python

我有一组标识符,它们被分成三组。对于每个组,我想将它们随机分配到三组中的一组,并将这些分配存储在另一个数组中。因此,对于给定的分组标识符数组(我对它们进行了预排序):

groupings = array([1,1,1,2,2,2,3,3,3])

可能的输出是

assignments = array([0,1,2,1,0,2,2,0,1])

最终,我希望能够生成许多这样的分配列表,并且能够高效地进行。我目前的方法只是创建一个零数组并将每个连续的长度为 3 的子数组设置为 3 的随机排列。

assignment = numpy.zeros((12,10),dtype=int)
for i in range(0,12,3):
    for j in range(10):
        assignment[i:i+3,j] = numpy.random.permutation(3)

有better/faster方法吗?

我可以考虑两件事:

  1. 与其在内部循环中访问二维数组 3 row * 1 column,不如尝试访问它 1*3。首先水平访问 2D 数组通常比首先垂直访问更快,因为它为您提供了更好的空间局部性,这有利于缓存。

  2. 而不是每次运行 numpy.random.permutation(3),如果3是固定的并且是一个小数,尝试预先生成排列数组并保存它们变成一个常量数组,如:(array([0,1,2]), array([0,2,1]), array([1,0,2])...)。你只需要每次从中随机选择一个数组即可。