将点列表转换为单独的y和x列表

时间:2017-07-10 13:59:07

标签: python list numpy

我有一个像这样的结构列表:

>>> print(pts)
[[(120, 1200), (121, 1201), (122, 1202)],
 [(130, 1300), (131, 1301), (132, 1302)]]

我需要将所有x和y点分别连接起来:

>>> print(y)
[120 121 122 130 131 132]
>>> print(x)
[1200 1201 1202 1300 1301 1302

原始列表由以下方法创建:

pts = []
y = [120, 121, 122]
x = [1200, 1201, 1202]
pts.append(list(zip(y, x)))
x = [1300, 1301, 1302]
y = [130, 131, 132]
pts.append(list(zip(y, x)))

最终结果必须是单独的y和x列表,所以我可以将它与np.polyfit()一起使用。单个点列表和总列表的长度将有所不同,但是,我将始终具有相等的y和x点长度。我在想应该有一种重塑和切片的方法吗?也许我可以展平并采用y和x的奇数指数的所有偶数指数?

3 个答案:

答案 0 :(得分:4)

你可以试试这个:

from itertools import chain

pts = [[(120, 1200), (121, 1201), (122, 1202)],
[(130, 1300), (131, 1301), (132, 1302)]]

all_points = list(chain(*pts))

y = [i[0] for i in all_points]

x = [i[1] for i in all_points]

print y

print x

输出:

[120, 121, 122, 130, 131, 132]

[1200, 1201, 1202, 1300, 1301, 1302]

itertools.chain()将允许您展平嵌套列表并能够访问元组。

答案 1 :(得分:3)

您还可以将zip与列表理解结合使用:

x, y = zip(*(p for s in pts for p in s))

x
# (120, 121, 122, 130, 131, 132)

y
# (1200, 1201, 1202, 1300, 1301, 1302)

答案 2 :(得分:1)

通常,从小列表开始时,纯列表方法会更快。但是,由于您正在提供numpy函数,该函数可能会将asarray应用于其输入,因此我建议使用数组转置方法。

arr = np.array(pts) # 2x3x2 array
arr = arr.reshape(6,2)
x, y = arr.T   # unpack a 2x6 array

测试:

In [614]: pts
Out[614]: 
[[(120, 1200), (121, 1201), (122, 1202)],
 [(130, 1300), (131, 1301), (132, 1302)]]
In [615]: np.array(pts).shape
Out[615]: (2, 3, 2)
In [616]: np.array(pts).reshape(-1,2).T
Out[616]: 
array([[ 120,  121,  122,  130,  131,  132],
       [1200, 1201, 1202, 1300, 1301, 1302]])
In [617]: y, x = np.array(pts).reshape(-1,2).T
In [618]: y
Out[618]: array([120, 121, 122, 130, 131, 132])
In [619]: x
Out[619]: array([1200, 1201, 1202, 1300, 1301, 1302])

np.polyfit以:

开头
order = int(deg) + 1
x = NX.asarray(x) + 0.0
y = NX.asarray(y) + 0.0

如果使用pts创建extend,则公共zip*已足够

In [625]: pts = []
     ...: y = [120, 121, 122]
     ...: x = [1200, 1201, 1202]
     ...: pts.extend(list(zip(y, x)))
     ...: x = [1300, 1301, 1302]
     ...: y = [130, 131, 132]
     ...: pts.extend(list(zip(y, x)))
     ...: 
In [626]: pts
Out[626]: [(120, 1200), (121, 1201), (122, 1202), (130, 1300), (131, 1301), (132, 1302)]
In [627]: y,x = list(zip(*pts))
In [628]: y
Out[628]: (120, 121, 122, 130, 131, 132)
In [629]: x
Out[629]: (1200, 1201, 1202, 1300, 1301, 1302)

chain展平可以与*zip转置相结合,无需任何列表理解。

In [642]: pts
Out[642]: 
[[(120, 1200), (121, 1201), (122, 1202)],
 [(130, 1300), (131, 1301), (132, 1302)]]
In [643]: y,x=list(zip(*chain(*pts)))
In [644]: y
Out[644]: (120, 121, 122, 130, 131, 132)
In [645]: x
Out[645]: (1200, 1201, 1202, 1300, 1301, 1302)