2017-07-28 1 views
3

J'ai une liste de listes de tuples list1Créer matrice à partir de la liste de la liste des tuples en utilisant la compréhension liste

list1 = [[('a',0.01),('b',0.23),('c',1e-7)], 
     [('a',0.91),('b',0.067),('c',0.38)]] 

et je veux créer une matrice numpy où chaque ligne serait la deuxième valeur d'un tuple list1. Ainsi, la matrice, permet de l'appeler A, aurait forme

A = [[0.01,0.23,1e-7],[0.91,0.067,0.38]] 
A.shape 
>>> (2,3) 

Jusqu'à présent, je suis parvenu à atteindre cet objectif d'une manière lente et inefficace

A = [] 
for i in range(len(list1)): 
    A.append(np.array([v for k,v in list1[i]])) 
A = np.array(A) 

Comment puis-je faire cela en utilisant la compréhension de la liste?

Répondre

5

Vous avez besoin comprehensions liste imbriquée pour cela:

np.array([[tup[1] for tup in lst] for lst in list1]) 
Out: 
array([[ 1.00000000e-02, 2.30000000e-01, 1.00000000e-07], 
     [ 9.10000000e-01, 6.70000000e-02, 3.80000000e-01]]) 

Une meilleure solution serait:

np.array(list1)[:,:,1].astype('float') 
Out: 
array([[ 1.00000000e-02, 2.30000000e-01, 1.00000000e-07], 
     [ 9.10000000e-01, 6.70000000e-02, 3.80000000e-01]]) 
+1

réel agréable. C'est impressionnant la quantité d'opérations qui peuvent être écrites de manière concise en numpy. –

+0

Merci @ayhan qui a vraiment bien fonctionné .. chose étrange est que votre première solution fonctionne plus vite que votre deuxième solution (mieux?). J'ai le sentiment que cela a quelque chose à voir avec ma structure de données - ma liste de listes de tuples est en fait un modèle lda utilisant [gensim] (https://radimrehurek.com/gensim/models/ldamodel.html), et le La façon dont vous appelez chaque liste est 'lda [corpus [i]]' qui imprime les tuples de la liste 'i'. – killerT2333

+1

@KillianTattan Oui, c'est mieux dans le sens où c'est une solution directe numpy donc c'est plus idiomatique pour les vecteurs. numpy ne gère pas très bien les dtypes d'objets, donc la lenteur est probablement due à ça. Je soupçonne que si vous aviez une liste de tuples dont les valeurs sont des nombres, la solution numpy dépasserait la compréhension de la liste. – ayhan