【问题标题】:How to flatten zipped object containing nested arrays to a list?如何将包含嵌套数组的压缩对象展平为列表?
【发布时间】:2016-05-30 22:37:47
【问题描述】:

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

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))

但是当我打印时数组仍然存在。

我做错了什么?

【问题讨论】:

  • 数据是嵌套的
  • 注意您看到该建议的上下文。你不能盲目地将它应用到任何地方,你需要了解它为什么在这些情况下有效。
  • @PadraicCunningham - 谢谢,为了清楚起见,我编辑了标题

标签: python list python-3.x numpy


【解决方案1】:

使用其中之一

这是一个 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 通常会更快,因为没有复制内存,但你必须 修改它返回的数组时要更加小心。

【讨论】:

  • 你不需要tolist,你实际上也不需要flatten,你可以array.flat,extend需要一个iterable
  • @PadraicCunningham,感谢您指出这一点。我刚刚编辑了我的答案。
  • 如果要扩展也可以使用.ravel,ravel并不总是需要复制
【解决方案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))

【讨论】:

    【解决方案3】:
    from itertools import chain
    list(chain.from_iterable(chain([x], chain.from_iterable(y)) for x, y in z))
    

    我只使用chain 来保持一致性,但正如@Padriac 所展示的那样,有很多方法可以使事物变平。

    【讨论】:

      猜你喜欢
      • 2021-11-06
      • 1970-01-01
      • 2020-10-17
      • 2023-03-21
      • 2015-09-17
      • 2020-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多