2016-08-07 28 views
4

Ich habe eine Funktion, die mir manchmal eine Liste der Listen gibt, wo die verschachtelten Listen manchmal nur ein Element haben, wie diese:Randomly wählen Sie den Eintrag aus der Liste der Listen gibt Valueerror

a = [['1'], ['3'], ['w']] 

Und wollen zufällig Wählen Sie einen Eintrag aus der Hauptliste a. Wenn ich versuche, np.random.choice auf dieser Liste zu verwenden, bekomme ich eine ValueError: a must be 1-dimensional.

Aber wenn die Liste ist statt:

b = [['1'], ['3'], ['w', 'w']] 

Dann np.random.choice funktioniert perfekt in Ordnung verwenden. Warum ist das? Und wie kann ich es so machen, dass ich zufällig aus beiden Arten von Listen auswählen kann?

+1

Der einfachste Weg wäre, nur 'random.choice' zu ​​verwenden. Sie brauchen nicht ** numpy ** für alles. – Matthias

Antwort

3

Ich denke choice ist zuerst Ihre Liste in ein Array.

Im zweiten Fall ist diese Anordnung ein 1D-Array mit DTYPE Objekt ist:

In [125]: np.array([['1'], ['3'], ['w', 'w']]) 
Out[125]: array([['1'], ['3'], ['w', 'w']], dtype=object) 
In [126]: _.shape 
Out[126]: (3,) 

In der zweiten, macht es eine 2D-Anordnung von Zeichenketten:

In [127]: np.array([['1'], ['3'], ['w']]) 
Out[127]: 
array([['1'], 
     ['3'], 
     ['w']], 
     dtype='<U1') 
In [128]: _.shape 
Out[128]: (3, 1) 

Dies ist ein Problem, das kommt regelmäßig auf. np.array versucht, als ein hohes dimensionales Array zu erstellen, wie die Eingabe ermöglicht.

Prevent numpy from creating a multidimensional array

+0

Sie müssen nicht nur "denken"; Sie können den Code in https://github.com/numpy/numpy/blob/master/numpy/random/mtrand/mtrand.pyx finden, wo Sie finden, dass die erste Sache 'Wahl' ist' a = np .array (a, Kopie = Falsch) '. –

+0

Jetzt bin ich dran, um die Antwort zu verwerfen, die ich bearbeitet habe. hpaulj ist einfach zu schnell. :) –

0

Zur Beantwortung der Verwendung Teil, den Sie können, „wie es funktioniert“:

np.random.choice(np.squeeze(a)) 

Beachten Sie, dass dies für a die eckigen Klammern beseitigen wird, aber nicht für b. Aber könnte immer noch nützlich sein.