2015-10-26 48 views
5

我有一个已经分组为三个的标识符数组。对于每个组,我想随机将它们分配到三个集合中的一个,并将这些分配存储在另一个数组中。因此,对于分组标识的特定阵列(我预先分类它们):蟒蛇中的子阵列上的排列

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) 

随机排列是否有更好的/更快的方法?

+0

所以我明白'10'是一个虚拟的示例值,你想要更大。那么'12'呢,它也是一个虚拟值,还是一直是12? – Julien

+0

这也是一个虚拟值。实际上,对我而言,它接近12k。 – dunstantom

回答

4

两件事我能想到的:的

  1. ,而不是访问二维数组3 row * 1 column在你的内部循环,尝试访问它1*3。首先水平访问二维数组通常比垂直首先要快,因为它为您提供了更好的空间局部性,这对缓存很有帮助。

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