2015-10-26 7 views
5

Ich habe ein Array von Bezeichnern, die in drei gruppiert wurden. Für jede Gruppe möchte ich sie zufällig einem von drei Sets zuordnen und diese Zuordnungen in einem anderen Array speichern lassen. Also, für eine bestimmte Reihe von gruppierten Kennungen (I vorsortieren sie):Permutationen über Sub-Array in Python

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

Eine mögliche Ausgabe

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

Letztlich wäre, ich möchte in der Lage sein, viele dieser Zuordnungslisten zu erzeugen, und um es effizient zu machen. Meine aktuelle Methode ist nur ein Nullen Array und stellen Sie die einzelnen aufeinander folgenden Sub-Array mit einer Länge von 3 auf eine zufällige Permutation von 3.en

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) 

Gibt es einen besseren/schnelleren Weg zu schaffen?

+0

So verstehe ich die ‚10‘ ein Dummy-Beispielwert ist, dass Sie viel größer möchten. Was ist mit der '12', ist es auch ein Dummy-Wert oder wird es immer 12 sein? – Julien

+0

Es ist auch ein Dummy-Wert. In Wirklichkeit ist es für meinen Fall näher an 12k. – dunstantom

Antwort

4

Zwei Dinge, die ich denken kann:

  1. stattdessen den 3 row * 1 column in Ihrer inneren Schleife 2D-Array von besuchen, versuchen Sie es zu besuchen 1*3. Der horizontale Zugriff auf ein 2D-Array ist in der Regel schneller als zuerst, da es Ihnen eine bessere räumliche Lokalität bietet, die sich gut für das Caching eignet.

  2. statt numpy.random.permutation(3) jedes Mal laufen, wenn 3 befestigt ist, und eine kleine Zahl ist, versuchen Sie die Arrays von Permutationen vorher zu erzeugen und sie in eine konstante Reihe von Array speichern wie: (array([0,1,2]), array([0,2,1]), array([1,0,2])...). Sie müssen nur jedes Mal ein Array daraus auswählen.