【发布时间】:2015-03-14 23:13:31
【问题描述】:
扁平化嵌套列表的方法有很多。我在这里复制一个解决方案仅供参考:
def flatten(x):
result = []
for el in x:
if hasattr(el, "__iter__") and not isinstance(el, basestring):
result.extend(flatten(el))
else:
result.append(el)
return result
我感兴趣的是逆运算,它将列表重建为其原始格式。例如:
L = [[array([[ 24, -134],[ -67, -207]])],
[array([[ 204, -45],[ 99, -118]])],
[array([[ 43, -154],[-122, 168]]), array([[ 33, -110],[ 147, -26],[ -49, -122]])]]
# flattened version
L_flat = [24, -134, -67, -207, 204, -45, 99, -118, 43, -154, -122, 168, 33, -110, 147, -26, -49, -122]
有没有一种有效的方法来展平、保存索引并重建为原始格式?
请注意,列表可以是任意深度,并且可能没有规则的形状,并且将包含不同维度的数组。
当然,扁平化函数也要改成存储列表的结构和numpy数组的形状。
【问题讨论】:
-
您应该如何从扁平化版本中知道它最初的样子?您在展平过程中丢失了信息。
-
当然,扁平化功能应该改成存储列表的结构。
-
在某种程度上,您已经回答了自己的问题;您需要修改
flatten以提供有关列表结构和其中数组形状的保留信息。例如,它可以在扁平化的L旁边返回[[(2, 2)], [(2, 2)], [(2, 2), (3, 2)]]。然后你将不得不相应地切分L_flat和reshape每个切片中的数组。 -
是的,我认为/希望有人有现成的配方。
-
我很难相信纯 Python 中的扁平化、保存、读取和重构会击败内在 (C) 方法来做同样的事情。您可能应该更好地定义“相对于什么慢”。相对于纯 C 或 FORTRAN?当然。相对于 XML?可能不是。您是否知道创建
array(L)会将您的列表构建成一个 numpy 本机数组,该数组将保留结构?你用 savez 测试过 p×q×N 数组的性能吗?
标签: python arrays numpy nested-lists flatten