我有这样的结构:
[
array([ 0. , 4.5, 9. ]),
[
array([ 100., 120., 140.]),
[
array([ 1000., 1100., 1200.]),
array([ 1200., 1300., 1400.])
],
array([ 150., 170., 190.]),
[
array([ 1500., 1600., 1700.]),
array([ 1700., 1800.])
]
]
]
(其中 array
是 numpy.array
)
如何编写一个生成器来给我:
(0, 4.5), (100, 120), (1000, 1100)
(0, 4.5), (100, 120), (1100, 1200)
(0, 4.5), (120, 140), (1200, 1300)
(0, 4.5), (120, 140), (1300, 1400)
(4.5, 9), (150, 170), (1500, 1600)
(4.5, 9), (150, 170), (1600, 1700)
(4.5, 9), (170, 190), (1700, 1800)
到目前为止,我唯一拥有的是:
def loop_bin(bins):
for i in range(len(bins)-1):
yield [bins[i], bins[i+1]]
最佳答案
根据您的情况,我将其分解为几种不同类型的迭代:重叠
和配对
(以及常规迭代)。
然后,我在 dopair
中递归遍历您的树结构,它会分析类型来决定如何迭代它所看到的数据。该决定基于我们是处理节点(包含子树)还是叶子(数组)。
generator
启动这一切。 izip
允许我们同时迭代两个生成器。
from itertools import izip
class array(list):
pass
arr = [
array([ 0. , 4.5, 9. ]),
[
array([100., 120., 140.]),
[
array([ 1000., 1100., 1200.]),
array([ 1200., 1300., 1400.])
],
array([ 150., 170., 190.]),
[
array([ 1500., 1600., 1700.]),
array([ 1700., 1800.])
]
]
]
# overlap(structure) -> [st, tr, ru, uc, ct, tu, ur, re]
def overlap(structure):
for i in range(len(structure)-1):
yield (structure[i],structure[i+1])
# paired(structure) -> [st, ru, ct, ur]
def paired(structure):
for i in range(0,len(structure)-1,2):
yield (structure[i],structure[i+1])
def dopair(first,second):
if all(isinstance(x,array) for x in second):
for pa,ir in izip(overlap(first),second):
for item in overlap(ir):
yield pa, item
else:
for pa,(i,r) in izip(overlap(first),paired(second)):
for item in dopair(i,r):
yield (pa,) + item
def generator(arr):
for pa,ir in paired(arr):
for x in dopair(pa,ir):
yield x
for x in generator(arr):
print x
关于python - 循环树状结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12674537/