作为输入,我收到两种类型的列表,这些列表由x和y坐标组成,表示多边形和多面几何。实际上,输入表示在GeoJson standard
中 list1
表示简单多边形几何体的坐标,list2
表示多面体几何体:
list1 = [[[0 , 0], [0, 1], [0 ,2]]]
list2 = [[[[0, 0] , [0, 1], [0, 2]], [[1, 0], [1, 1], [1 ,2]]]]
多面体几何体(list2
)由比简单多边形几何体(list1
)深一层的列表列表表示。
我想展平这些列表以获得这些输出:
if input is list1 type : list1_out = [[0, 0, 0, 1, 0, 2]]
if input is list2 type : list2_out = [[0, 0, 0, 1, 0, 2], [1, 0, 1, 1, 1, 2]]
我使用的代码通常用于展平列表,其中input
可以是两种类型的列表:
[coords for polygon in input for coords in polygon]
使用上面的代码,list1
的输出是正确的,但list2
的输出如下:
[[[0, 0] ,[0, 1], [0, 2]], [1, 0], [1, 1], [1, 2]]]
是否有一个函数可以深度压扁这两种类型的列表以获得预期的输出?
编辑:效果真的很重要,因为列表非常大
编辑2:我可以使用if句子来过滤每种类型的列表
答案 0 :(得分:1)
将您的数据投射到numpy.array
,您可以使用reshape
:
import numpy as np
t = np.array([[[[0, 0] , [0, 1], [0, 2]], [[1, 0], [1, 1], [1 ,2]]]])
print t.shape # (1, 2, 3, 2)
t = np.reshape([1, 2, 6]) # merging the last 2 coordinates/axes
根据需要展平第二个列表。
适用于这两个列表的代码(因为在这两种情况下,您想要将最后一个合并到轴上)是:
t = np.array(yourList)
newShape = t.shape[:-2] + (t.shape[-2] * t.shape[-1], ) # this assumes your
# arrays are always at least 2 dimensional (no need to flatten them otherwise...)
t = t.reshape(t, newShape)
关键是保持形状不变直到最后2个轴(因此
t.shape[:-2]
),但要将最后两个轴合并在一起(使用长度为t.shape[-2] * t.shape[-1]
的轴)
我们通过连接这两个元组来创建新形状(因此乘法后的额外逗号)。
修改:np.reshape()
doc是here。重要的参数是输入数组(你的列表,作为数组转换)和一个我称之为newShape
的元组,它代表沿新轴的长度。
答案 1 :(得分:1)
尝试;
代表list1
[sum(x, []) for x in list1]
代表list2
[sum(x, []) for a in list2 for x in a]
<强>演示强>
>>> list1 = [[[0 , 0], [0, 1], [0 ,2]]]
>>> list2 = [[[[0, 0] , [0, 1], [0, 2]], [[1, 0], [1, 1], [1 ,2]]]]
>>> [sum(x, []) for x in list1]
[[0, 0, 0, 1, 0, 2]]
>>> [sum(x, []) for a in list2 for x in a]
[[0, 0, 0, 1, 0, 2], [1, 0, 1, 1, 1, 2]]
>>>