2015-10-26 47 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])...)。你只需要每次從它中隨機選擇一個數組。