我有一个形状如下的零列表:
yp = numpy.zeros(5, 2, 2), dtype = complex)
我使用以下两个for循环对其进行了修改:
for a in range(0,5):
for b in range(0, 2):
yp[a, b, b] = numpy.sum(F[a, b,:])
如何使用列表理解来做同样的事情? 显然,使用下面的行会更改我的原始列表的形状。
yp = [numpy.sum(F[a, b,:]) for a in range(0,5) for b in range(0, 2)]
答案 0 :(得分:3)
您的原始循环无法转换为列表理解,因为它没有分配numpy矩阵的所有元素。列表理解总是产生完整的列表(或列表列表)。
如果您的目标是用零填充未分配的元素,那么对应的列表理解可能是这样的:
[ [ [0,0,numpy.sum(y_network[a, b, :])] for b in range(2)] for a in range(5)]
区别在于,每个理解级别都会生成一个列表,该列表本身会对元素使用理解。
请注意,这并不完全相同,因为numpy.sum(y_network[a, b, :])
的值始终放在第3维的最后一个元素中,而不是索引b
处。您可以使用更多代码左右填充零,但这将使其变得复杂且难以理解,这几乎使使用列表理解的目的无法实现。
您还可以为任务编写一个循环:
for b in range(2): yl[:,b,b] = np.sum(network[:,b,:],1)
答案 1 :(得分:1)
问题在于您仅分配[a,b,b](2 x 2矩阵的对角线),其余部分保持原样,并且在列表理解中很难做到这一点。以下内容将与您所拥有的相同,但是效率很低。
yp = numpy.array([numpy.sum(y_network[a, b,:]) if b==c else yp[a,b,b] for a in range(0,5) for b in range(0, 2) for c in range(0,2)]).reshape(5,2,2)
或者您可以在后面插入yp[a,b,b]
yp = [numpy.sum(y_network[a, b,:]) for a in range(0,5) for b in range(0, 2)]
使用正确的索引以提高效率,但是嵌套循环应该更好。