2016-03-22 3 views
2

Ich habe einige Wörter in einem Wörterbuch und nach diesen und einigen Sätzen möchte ich ein bestimmtes Array erstellen.Create Array von dict

words = {'a': array([ 1.78505888, -0.40040435, -0.2555062 ]), 'c': array([ 0.58101204, -0.23254054, -0.5700197 ]), 'b': array([ 1.17213122, 0.38232652, -0.78477569]), 'd': array([-0.07545012, -0.10094538, -0.98136142])} 

sentences = [['a', 'c'], ['b', 'a', 'd'], ['d', 'c']] 

Was ich will, ist ein Array mit der ersten Reihe ist, um die die Werte von ‚a‘ und ‚c‘ vertikal gestapelt zu erhalten.
Die zweite Zeile ist die vertikal gestapelten Werte von 'b' und 'a'.
Und die dritte, die Werte von 'd' und 'c' vertikal gestapelt.

Ich versuchte dies:

np.vstack((words[word] for word in sentences[0])) 
>>> array([[ 1.78505888, -0.40040435, -0.2555062 ], 
    [ 0.58101204, -0.23254054, -0.5700197 ]]) 

Also das ist meine erste Reihe ist, aber ich bin das nicht in der Lage zu tun für ‚Sätze‘ mit Liste Verständnis (nur für eine Person).

EDIT: Im Grunde, was ich versuche, ist die folgende

first_row = np.vstack((words[word] for word in sentences[0])) 
second_row = np.vstack((words[word] for word in sentences[1])) 
third_row = np.vstack((words[word] for word in sentences[2])) 

l = [] 
l.append(first_row) 
l.append(second_row) 
l.append(third_row) 

print np.array(l) 
>>> [[[ 1.78505888 -0.40040435 -0.2555062 ] 
     [ 0.58101204 -0.23254054 -0.5700197 ]] 

    [[ 1.17213122 0.38232652 -0.78477569] 
     [ 1.78505888 -0.40040435 -0.2555062 ] 
     [-0.07545012, -0.10094538, -0.98136142]] 

    [[-0.07545012 -0.10094538 -0.98136142] 
     [ 0.58101204 -0.23254054 -0.5700197 ]]] 
+0

können Sie bitte eine Beispielausgabe schreiben? – AceLearn

+0

Haben Sie immer die gleiche Anzahl von Elementen für jede Taste in 'words', wie hier in' 3's? Haben Sie immer die gleiche Anzahl von Elementen pro Index in "Sätzen", wie sie paarweise in den Beispieldaten sind? – Divakar

+0

Im 'Wörter' Wörterbuch haben alle Werte die gleiche Dimension (numpy Array der Größe n), aber in 'Sätzen' können die Zeilen unterschiedlich lang sein. – dooms

Antwort

2

Sie np.searchsorted Korrespondenz zwischen den String-Schlüssel von words und die Saiten in jedem Element von sentences etablieren können zu tun. Wiederholen Sie diesen Vorgang für alle Elemente in sentences für das Endergebnis. Somit hätten wir nur eine Schleife, um es zu lösen. Die Umsetzung würde wie folgt aussehen -

K = words.keys() 
sortidx = np.argsort(K) 
V = np.vstack(words.values())[sortidx] 
out = [V[np.searchsorted(K,S,sorter=sortidx)] for S in sentences] 

Probelauf -

In [122]: words 
Out[122]: 
{'a': array([ 1.78505888, -0.40040435, -0.2555062 ]), 
'b': array([ 1.17213122, 0.38232652, -0.78477569]), 
'c': array([ 0.58101204, -0.23254054, -0.5700197 ]), 
'd': array([-0.07545012, -0.10094538, -0.98136142])} 

In [123]: sentences 
Out[123]: [['a', 'c'], ['b', 'a', 'd'], ['d', 'c']] 

In [124]: K = words.keys() 
    ...: sortidx = np.argsort(K) 
    ...: V = np.vstack(words.values())[sortidx] 
    ...: out = [V[np.searchsorted(K,S,sorter=sortidx)] for S in sentences] 
    ...: 

In [125]: out 
Out[125]: 
[array([[ 1.78505888, -0.40040435, -0.2555062 ], 
     [ 0.58101204, -0.23254054, -0.5700197 ]]), 
array([[ 1.17213122, 0.38232652, -0.78477569], 
     [ 1.78505888, -0.40040435, -0.2555062 ], 
     [-0.07545012, -0.10094538, -0.98136142]]), 
array([[-0.07545012, -0.10094538, -0.98136142], 
     [ 0.58101204, -0.23254054, -0.5700197 ]])] 
+0

Mein Wörterbuch wird sehr groß sein, also glaube ich nicht, dass es eine gute Idee ist, es zu duplizieren. – dooms

+0

@dooms Duplizieren was genau? Könnten Sie das klären? – Divakar

+0

Hier werden 'V' und 'K' aus 'Wörtern' erzeugt, also teilen Sie mein Wörterbuch grundsätzlich in Schlüssel und Werte. In der Erinnerung wird es also doppelt so viele Wörter geben. – dooms