如何将包含嵌套数组的压缩对象展平到列表中?

时间:2016-05-30 22:37:47

标签: python list python-3.x numpy

我有一个这样的压缩对象:

z = zip(a, b)
lst = list(z)

print(lst)

输出:

[(0, array([[72, 65],
           [70, 71]], dtype=uint8)), 
(1, array([[ 71,  99],
           [190, 163]], dtype=uint8)), 
(2, array([[52, 59],
           [69, 72]], dtype=uint8)), etc...

我想将此列表展平为以下内容:

[0, 72, 65, 70, 71, 1, 71, 99, 190, 163, 2, 52, 59 etc..]

我已尝试用

执行此操作
y = sum(w, ())
# or 
y = list(itertools.chain(*lst))

但是当我打印时阵列仍然存在。

我做错了什么?

3 个答案:

答案 0 :(得分:3)

使用

之一

这是一个MWE。

import numpy as np

lists = [(0, np.array([ [72,  65],
                        [70,  71]], dtype=np.uint8)), 
        (1, np.array([  [71,  99],
                        [190, 163]], dtype=np.uint8))]

l = list()
for idx, array in lists:
    l.append(idx)
    l.extend(np.ravel(array))   # returns a contiguous flattened array
    #l.extend(array.flat)       # return a 1-D iterator over the array.
    #l.extend(array.flatten())  # return a copy of the array collapsed into one dimension 

print(l)
# Output
[0, 72, 65, 70, 71, 1, 71, 99, 190, 163]

在谈到ravelflatten之间的差异时,请摘自What is the difference between flatten and ravel functions in numpy?

  

区别在于flatten始终返回副本并返回ravel   尽可能查看原始数组。这在以下是不可见的   打印输出,但如果你修改ravel返回的数组,它   可以修改原始数组中的条目。如果你修改了   从flatten返回的数组中的条目永远不会发生。   ravel通常会更快,因为没有内存被复制,但你必须这样做   更加小心修改它返回的数组。

答案 1 :(得分:2)

您的数据是嵌套的,因此您需要使用链来递归地展平哪个链不起作用,您可以做的是展平numpy数组并添加:

from itertools import chain

print list(chain.from_iterable(([a] + arr.flatten().tolist()) for a, arr in lst))

或使用.flat和内链:

print list(chain.from_iterable(chain([a],  arr.flat) for a, arr in lst))

答案 2 :(得分:0)

from itertools import chain
list(chain.from_iterable(chain([x], chain.from_iterable(y)) for x, y in z))

我只是使用chain来保持一致性,但正如@Padriac所示,有很多方法可以让事情变得平坦。