2016-03-22 26 views
2

Bir sözlükte bazı kelimeler var ve bunlara ve bazı cümlelere göre belirli bir dizi oluşturmak istiyorum. Ne istiyorumDict dizisinden dizi oluştur

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']] 

ilk satır, dikey olarak istiflenmiş 'a' ve 'c' değerleri olan bir dizi elde etmektir.
İkinci satır, 'b' ve 'a' değerleri dikey olarak yığılmış.
Ve üçüncü olarak, 'd' ve 'c' değerleri dikey olarak yığılmış.

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

Yani bu benim ilk satır, ama (sadece biri için) 'cümleler' kullanarak liste anlama için bunu yapmak mümkün değilim:

Bu çalıştı.

DÜZENLEME: Temelde benim yapmaya çalışıyorum Sen words dize anahtarları ve sentences her elemanda dizeleri arasındaki ilişki oluşturmak np.searchsorted kullanabileceğiniz aşağıdaki

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

bir örnek çıktı gönderebilir misiniz? – AceLearn

+0

Her bir anahtar için, her zaman ''' 'in' '' in '' in içinde olduğu gibi, aynı sayıda elemanınız var mı? Örnek verilerdeki çiftlerdekiler gibi, her zaman her kuruşta 'cümlede' sayıya eşit sayıda öğe var mı? – Divakar

+0

'Sözcükler' sözlüğünde, tüm değerler aynı boyuta sahiptir (n nümerik sayı dizisi), ancak 'cümleler' satırlarında farklı uzunluklarda olabilir. – dooms

cevap

2

olduğunu. Son işlem için sentences'daki tüm öğeler için bu işlemi tekrarlayın. Böylece, onu çözmek için sadece bir döngü seviyesine sahip olurduk. Uygulama şu şekilde görünecektir -

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] 

Numune koşmak -

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

Sözlüküm çok büyük olacak, bu yüzden çoğaltmanın iyi bir fikir olduğunu düşünmüyorum. – dooms

+0

@dooms Tam olarak neyi kopyalayın? Açıklar mısınız? – Divakar

+0

Burada 'V' ve 'K', 'kelimeler' den oluşturulur, bu yüzden temelde sözlüğümü anahtarlara ve değerlere bölüyorsunuz. Yani hafızada iki katı kelime büyüklüğü olacak. – dooms