使用列表推导式从元组列表的列表创建矩阵

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)

我该如何使用列表推导式来完成这个任务?
1个回答

6
你需要使用嵌套的列表推导式来实现这个功能:
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中,可以简洁地编写大量操作,令人印象深刻。 - Eric Duminil
谢谢@ayhan,这真的很有效。奇怪的是,你的第一个解决方案比你的第二个(更好?)解决方案运行得更快。我有一种感觉,这与我的数据结构有关 - 我的列表中包含元组的列表实际上是使用gensim的lda模型,而调用每个列表的方式是lda[corpus[i]],它打印出列表i的元组。 - PyRsquared
1
@KillianTattan 是的,从向量的角度来看,它更好,因为它是一个直接的numpy解决方案,所以更符合惯用法。numpy不能很好地处理对象dtypes,所以慢可能是因为这个原因。我怀疑如果你有一个元素值为数字的列表列表元组,numpy解决方案将优于列表理解。 - ayhan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接