2016-07-20 103 views
1

Ich habe ein numpy Array A der Größe ((s1, ... sm)) mit Integer-Einträge und ein Wörterbuch D mit Ganzzahlen als Schlüssel und numpy Arrays der Größe ((t)) als Werte. Ich möchte das Wörterbuch für jeden Eintrag des Arrays A auswerten, um ein neues Array B der Größe ((s1, ... sm, t)) zu erhalten.Ersatzeinträge von numpy Array mit numpy Arrays

Zum Beispiel

D={1:[0,1],2:[1,0]} 
A=np.array([1,2,1]) 

Der Ausgang Ruf seines

array([[0,1],[1,0],[0,1]]) 

Motivation: Ich habe ein Array mit Indizes von Einheitsvektoren als Einträge und ich brauche es in eine Anordnung mit den Vektoren zu transformieren, wie Einträge.

Antwort

1

Wenn Sie Ihre Schlüssel umbenennen 0-indiziert werden, können Sie direkte Array Abfrage auf Einheitsvektoren verwenden:

>>> units = np.array([D[1], D[2]]) 
>>> B = units[A - 1] # -1 because 0 indexed: 1 -> 0, 2 -> 1 
>>> B 
array([[0, 1], 
     [1, 0], 
     [0, 1]]) 

Und in ähnlicher Weise für jede Form:

>>> A = np.random.random_integers(0, 1, (10, 11, 12)) 
>>> A.shape 
(10, 11, 12) 
>>> B = units[A] 
>>> B.shape 
(10, 11, 12, 2) 

Sie mehr über erweiterte Indizierung auf der numpy doc

+0

Sehr elegant - danke! – fact

0

Hier ist ein Ansatz mit np.searchsorted diese Zeile Indizes Index in die Werte des Wörterbuchs zu lokalisieren und dann einfach die Indizierung die gewünschte Ausgabe zu erhalten, wie so -

idx = np.searchsorted(D.keys(),A) 
out = np.asarray(D.values())[idx] 

Probelauf -

In [45]: A 
Out[45]: array([1, 2, 1]) 

In [46]: D 
Out[46]: {1: [0, 1], 2: [1, 0]} 

In [47]: idx = np.searchsorted(D.keys(),A) 
    ...: out = np.asarray(D.values())[idx] 
    ...: 

In [48]: out 
Out[48]: 
array([[0, 1], 
     [1, 0], 
     [0, 1]]) 
0
>>> np.asarray([D[key] for key in A]) 
array([[0, 1], 
     [1, 0], 
     [0, 1]]) 
+0

lernen Obwohl dieser Code Hilfe sein kann, das Problem, die Bereitstellung zusätzlicher Kontext in Bezug auf _why_ und/oder zu lösen _how_ es beantwortet die Frage würde seinen langfristigen Wert erheblich verbessern. Bitte [bearbeiten] Sie Ihre Antwort, um eine Erklärung hinzuzufügen. –