我有这种结构:
[
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]]
根据您的情况,我将其分解为几种不同类型的迭代:overlap
和 paired
(以及常规迭代)。
然后我在 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
我是一名优秀的程序员,十分优秀!