2017-07-28 85 views
3

創建一個從元組的名單列表矩陣我的元組list1使用列表理解

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

的列表清單,我想創建一個numpy的矩陣,其中每行是一個元組中的第二個值list1。因此,矩陣,讓我們把它叫做A,將有形式

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

到目前爲止,我已經設法在一個緩慢而低效的方式

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

我怎樣才能做到這一點使用列表解析來實現這一目標?

回答

5

您需要嵌套列表理解爲這樣的:

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

一個更好的解決辦法是:

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

真正的好。這是令人印象深刻的可以在numpy簡潔寫作的操作數量。 –

+0

感謝@ayhan,確實運行良好..奇怪的是,你的第一個解決方案比你的第二個(更好的?)解決方案工作得更快。我有一種感覺,它與我的數據結構有關 - 我的元組列表實際上是一個使用[gensim](https://radimrehurek.com/gensim/models/ldamodel.html)的lda模型,而你在每個列表上調用的方式是'lda [corpus [i]]',它打印列表'i'的元組。 – killerT2333

+1

@KillianTattan是的,從某種意義上說它更好,因爲它是一種直接的numpy解決方案,所以對於矢量而言它更具慣用性。 numpy不能很好地處理對象dtypes,所以緩慢可能是因爲這個原因。我懷疑如果你有一個元組列表的列表,其值是數字,numpy解決方案將勝過列表理解。 – ayhan