在Python中遍历N维数组

1 投票
2 回答
707 浏览
提问于 2025-04-16 04:00

我有一个地图,我们叫它M,这个地图包含了通过N个维度映射的数据。

# If it was a 2d map, I could iterate it thusly:
start, size = (10, 10), (3, 3)
for x in range(start[0], start[0]+size[0]):
    for y in range(start[1], start[1]+size[1]):
        M.get((x, y))
# A 3d map would add a for z in ... and access it thusly
M.get((x, y, z))
# And so on.

我想问的是:我该怎么做一个迭代器,让它能按照正确的顺序来遍历这些数据?也就是说,给定 start, size = (10, 10), (3, 3),它应该能生成这样的二元组序列 (10, 10), (10, 11), (10, 12), (11, 10), (11, 11) 等等。而如果给定 start, size = (10, 10, 10), (3, 3, 3),它就应该能生成正确的三元组序列。

我自己试过,但真是搞得我头都大了。虽然这很有趣,但我也觉得不值得花时间去琢磨。你们自己决定吧 :)

2 个回答

0

使用自己动手制作的生成器表达式:

start, size = (10, 10), (3, 3)
values2=((x+xd,y+yd)
        for x,y in (start,)
        for xr,yr in (size,)
        for xd in range(xr)
        for yd in range(yr))

for x,y in values2:
    print x,y

start, size = (10, 10, 10), (3, 3, 3)
values3=((x+xd,y+yd, z+zd)
        for x,y,z in (start,)
        for xr,yr,zr in (size,)
        for xd in range(xr)
        for yd in range(yr)
        for zd in range(zr))

for x,y,z in values3:
    print x,y,z
8

在 Python 2.6 及以上版本中:

itertools.product(*[xrange(i, i+j) for i,j in zip(start, size)])

撰写回答