python中子数组上的置换

python中子数组上的置换,python,arrays,permutation,Python,Arrays,Permutation,我有一个标识符数组,它被分为三组。对于每个组,我想将它们随机分配到三个集合中的一个,并将这些分配存储在另一个数组中。因此,对于给定的分组标识符数组(我对它们进行了预排序): 可能的输出是 assignments = array([0,1,2,1,0,2,2,0,1]) 最终,我希望能够生成许多这样的任务列表,并且能够高效地完成。我目前的方法只是创建一个零数组,并将每个长度为3的连续子数组设置为3的随机排列 assignment = numpy.zeros((12,10),dtype=int)

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

可能的输出是

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)

有更好/更快的方法吗

我可以考虑两件事:

  • 不要访问内部循环中的2D数组
    3行*1列
    ,而是尝试访问它
    1*3
    。首先水平访问2D数组通常比首先垂直访问更快,因为它提供了更好的空间局部性,这有利于缓存

  • 不要每次运行
    numpy.random.permutation(3)
    ,如果
    3
    是固定的并且是一个小数字,请尝试事先生成排列数组,并将它们保存到一个常量数组中,如:
    (数组([0,1,2])、数组([0,2,1])、数组([1,0,2])
    。每次只需从中随机选取一个数组


  • 因此,我理解“10”是一个虚拟示例值,您希望更大。那么“12”呢?它也是一个伪值还是总是12?它也是一个伪值。事实上,就我而言,它接近12k。
    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)