2016-03-24 10 views
4

Ich möchte die Reihenfolge von nur einigen Zeilen in einem Array numpy mischen. Diese Reihen werden immer kontinuierlich sein (z. B. Mischreihen 23-80). Die Anzahl der Elemente in jeder Reihe kann von 1 (so dass das Array tatsächlich 1D ist) bis 100 variieren.Shuffle Reihenfolge einiger Zeilen in numpy Array

Unten ist ein Beispielcode, um zu demonstrieren, wie ich die Methode shuffle_rows() könnte funktionieren sehen. Wie würde ich eine solche Methode entwickeln, um effizient zu shufflieren?

import numpy as np 
>>> a = np.arange(20).reshape(4, 5) 
>>> a 
array([[ 0, 1, 2, 3, 4], 
     [ 5, 6, 7, 8, 9], 
     [10, 11, 12, 13, 14], 
     [15, 16, 17, 18, 19]]) 

>>> shuffle_rows(a, [1, 3]) # including rows 1, 2 and 3 in the shuffling 
array([[ 0, 1, 2, 3, 4], 
     [15, 16, 17, 18, 19], 
     [ 5, 6, 7, 8, 9], 
     [10, 11, 12, 13, 14]]) 

Antwort

3

Sie können np.random.shuffle verwenden. Dies mischt die Zeilen selbst, nicht die Elemente innerhalb der Zeilen.

Von der docs:

Diese Funktion steht nur das Array schlurft dem ersten Index eines mehrdimensionalen Array

Als Beispiel:

import numpy as np 


def shuffle_rows(arr,rows): 
    np.random.shuffle(arr[rows[0]:rows[1]+1]) 

a = np.arange(20).reshape(4, 5) 

print(a) 
# array([[ 0, 1, 2, 3, 4], 
#  [ 5, 6, 7, 8, 9], 
#  [10, 11, 12, 13, 14], 
#  [15, 16, 17, 18, 19]]) 

shuffle_rows(a,[1,3]) 

print(a) 
#array([[ 0, 1, 2, 3, 4], 
#  [10, 11, 12, 13, 14], 
#  [15, 16, 17, 18, 19], 
#  [ 5, 6, 7, 8, 9]]) 

shuffle_rows(a,[1,3]) 

print(a) 
#array([[ 0, 1, 2, 3, 4], 
#  [10, 11, 12, 13, 14], 
#  [ 5, 6, 7, 8, 9], 
#  [15, 16, 17, 18, 19]]) 
+0

Wenn ich versuche, ' print (shuffle_rows (a, [1,3])) 'in Python 3 bekomme ich" None "in der Ausgabe? – pir

+1

der Shuffle ist an Ort und Stelle erfolgt. 'print (a)' und Sie werden die gemischten Reihen sehen – tom

+0

Ah, macht Sinn. Danke für die Klarstellung! – pir