当我们使用列表理解时如何保持原始列表的形状?

How to keep the shape of original list when we're using list comprehension?

我有一个形状如下所示的零列表:

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

您的原始循环无法转换为列表理解,因为它没有分配 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)

问题是您只分配 [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)]

在正确的索引处使其更高效,但您拥有的嵌套循环应该更好。