我有一个这样的压缩对象:
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))
但是当我打印时阵列仍然存在。
我做错了什么?
答案 0 :(得分:3)
使用
之一numpy.ravel
返回一个连续的扁平数组。numpy.ndarray.flat
返回数组上的一维迭代器。 (这是一个numpy.flatiter
实例)numpy.ndarray.flatten
返回折叠为一维的数组副本。 这是一个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]
在谈到ravel
和flatten
之间的差异时,请摘自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所示,有很多方法可以让事情变得平坦。