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方法吗?
我可以考虑两件事:
与其在内部循环中访问二维数组 3 row * 1 column
,不如尝试访问它 1*3
。首先水平访问 2D 数组通常比首先垂直访问更快,因为它为您提供了更好的空间局部性,这有利于缓存。
而不是每次运行 numpy.random.permutation(3)
,如果3
是固定的并且是一个小数,尝试预先生成排列数组并保存它们变成一个常量数组,如:(array([0,1,2]), array([0,2,1]), array([1,0,2])...)
。你只需要每次从中随机选择一个数组即可。
我有一组标识符,它们被分成三组。对于每个组,我想将它们随机分配到三组中的一组,并将这些分配存储在另一个数组中。因此,对于给定的分组标识符数组(我对它们进行了预排序):
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方法吗?
我可以考虑两件事:
与其在内部循环中访问二维数组
3 row * 1 column
,不如尝试访问它1*3
。首先水平访问 2D 数组通常比首先垂直访问更快,因为它为您提供了更好的空间局部性,这有利于缓存。而不是每次运行
numpy.random.permutation(3)
,如果3
是固定的并且是一个小数,尝试预先生成排列数组并保存它们变成一个常量数组,如:(array([0,1,2]), array([0,2,1]), array([1,0,2])...)
。你只需要每次从中随机选择一个数组即可。