列表推导式可以在二维矩阵中替换for循环。

29
我试图使用列表推导式来替换for循环。
原始文件如下:
2 3 4 5 6 3
1 2 2 4 5 5
1 2 2 2 2 4

for循环

line_number = 0
for line in file:
    line_data = line.split()
    Cordi[line_number, :5] = line_data 
    line_number += 1

输出结果为

[[2 3 4 5 6 3]
 [1 2 2 4 5 5]
 [1 2 2 2 2 4]]

如果使用列表推导式,根据我的想法是这样的(我必须更改数据类型为int,以便在程序的后面部分绘制图表)

Cordi1= [int(x) for x in line.split() for line in data]

但是输出结果是:

[1, 1, 1]

但是line.split() for line in data实际上是一个列表,如果我尝试

Cordi1 = [int(x) for x in name of the list]

它能够正常工作,为什么会发生这种情况?


您可以使用列表推导式生成一个列表,但Cordi是一个numpy数组。 - Martijn Pieters
@MartijnPieters,啊,所以我不能用列表推导式生成一个二维数组吗? - rankthefirst
你可以将嵌套列表转换为二维数组,但是从这些数据生成numpy数组可能有更好的选择。 - Martijn Pieters
请参考如何将二维列表转换为二维numpy数组?以获取转换选项。 - Martijn Pieters
@MartijnPieters 谢谢,啊,但实际上嵌套的二维列表或numpy的二维列表,它们在绘制时都表现良好。但在以后的应用中,这可能会造成问题。无论如何还是谢谢! - rankthefirst
1个回答

66

你的循环顺序颠倒了;它们应该按照嵌套方式从左到右排序:

[int(x) for line in data for x in line.split()]

这段代码首先循环遍历data,然后对于每个line迭代,再对line.split()进行迭代以产生x。接下来,你需要从这些值中生成一个扁平化的整数列表。

但是,由于你正在尝试构建一个列表的列表,因此你需要在另一个列表推导式中嵌套一个列表推导式:

Cordi1 = [[int(i) for i in line.split()] for line in data]

演示:

>>> data = '''\
... 2 3 4 5 6 3
... 1 2 2 4 5 5
... 1 2 2 2 2 4
... '''.splitlines()
>>> [int(x) for line in data for x in line.split()]
[2, 3, 4, 5, 6, 3, 1, 2, 2, 4, 5, 5, 1, 2, 2, 2, 2, 4]
>>> [[int(i) for i in line.split()] for line in data]
[[2, 3, 4, 5, 6, 3], [1, 2, 2, 4, 5, 5], [1, 2, 2, 2, 2, 4]]

如果你想从这里得到一个多维的numpy数组,你可以直接将上述内容转换为数组或者从数据中创建一个数组,然后进行重塑:

>>> import numpy as np
>>> np.array([[int(i) for i in line.split()] for line in data])
array([[2, 3, 4, 5, 6, 3],
       [1, 2, 2, 4, 5, 5],
       [1, 2, 2, 2, 2, 4]])
>>> np.array([int(i) for line in data for i in line.split()]).reshape((3, 6))
array([[2, 3, 4, 5, 6, 3],
       [1, 2, 2, 4, 5, 5],
       [1, 2, 2, 2, 2, 4]])

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