我正在尝试遍历图像中的像素,而是垂直而不是常规的水平方式。这是我可能拥有的小尺寸图像的示例(我有几百个图像):
"""
Note: X represents pixels
Sample Image (3 x 4):
X X X X
X X X X
X X X X
"""
很明显,要在水平方向上遍历此图像很容易,就像我在这里所做的那样:
import itertools
width = range(3)
height = range(4)
print("Pixel positions:")
for pixel in itertools.product(width, height):
print(*pixel)
输出:
Pixel positions:
0 0
0 1
0 2
0 3
1 0
1 1
1 2
1 3
2 0
2 1
2 2
2 3
这些是图像中像素的索引位置(假定它是一个较大的2D像素列表),但水平迭代。我希望能够做到相同但垂直。是否有itertools函数可以让我按列执行相同的操作?以下是此示例图片的索引:
Column-wise:
0 0
1 0
2 0
0 1
1 1
2 1
0 2
1 2
2 2
0 3
1 3
2 3
我试图用print(*pixel[::-1])
反转位置,但是,这导致某些索引位置超出范围,例如从2 3
到3 2
的最后一个索引位置。 3 2
无效,因为没有3行(仅0、1、2)。其他职位也是如此。
我想要一个不使用非内置库的解决方案。 Itertools很好,因为我将它用于程序中的其他内容。
答案 0 :(得分:2)
尝试以下代码:
width = range(3)
height = range(4)
print("Pixel positions:")
for x in height:
for y in width:
print(y, x)
输出:
Pixel positions:
0 0
1 0
2 0
0 1
1 1
2 1
0 2
1 2
2 2
0 3
1 3
2 3
要水平迭代,只需交换两个for循环:
width = range(3)
height = range(4)
print("Pixel positions:")
for y in width:
for x in height:
print(y, x)
性能比较:
$ python -m timeit -n 100 '
width = range(1000)
height = range(1000)
for pixel in ((x, y) for y in height for x in width):
pass
'
100 loops, best of 3: 104 msec per loop
嵌套循环约快 8倍:
$ python -m timeit -n 100 '
width = range(1000)
height = range(1000)
for y in width:
for x in height:
pass
'
100 loops, best of 3: 12.7 msec per loop
当还创建一个包含结果坐标的元组时,代码仍然快 2倍。但是,对于手头的任务是否需要创建一个包含坐标的元组是个问题。
$ python -m timeit -n 100 '
width = range(1000)
height = range(1000)
for y in width:
for x in height:
(x, y)
'
100 loops, best of 3: 52.5 msec per loop
答案 1 :(得分:1)
根据文档,itertools.product(width, height)
等于:
((x, y) for x in width for y in height)
如果要逐列迭代,只需交换内部循环:
for pixel in ((x, y) for y in height for x in width):
print(*pixel)
0 0
1 0
2 0
0 1
1 1
2 1
0 2
1 2
2 2
0 3
1 3
2 3