【问题标题】:Loop nested arrays with pixel data to one array将带有像素数据的嵌套数组循环到一个数组
【发布时间】:2025-12-24 21:45:06
【问题描述】:

在这里的示例中,我们有数组矩阵 2*2 但它可以是任何例如4x4、16x16。

例如:我们通过第一个数组第 1 行,然后我们通过第二个数组第 1 行。当我们到达数组的最后 2 个项目的末尾后,我们跳转到第三个数组,依此类推。我们知道每个数组(图像部分)包含 64 列/行(像素),因此对于 128 像素的图像,我们循环 2 个数组,然后移动底部的数组。

这种场景下遍历数组的公式是什么?

这是我试图做的事情,但没有奏效......

# e.g. we have final image 128x128, so we have parts 4 * 64x64

# Empty arrays for every pixel
final_image_pixels = [None] * part_pixel_count * total_parts_count

# Loop through every parts
for i in range(len(image_pixels)):
    for x in range(part_width):                  
        for y in range(part_height):
            # Get location on part
            px_part_index = x + y * part_width
            # Index on final array
            px_final_index = px_part_index + (i * part_pixel_count)
            final_image_pixels[px_final_index] = image_pixels[i][px_part_index]

现在结果: (这些颜色与上面的描述图片无关)

应该是:

【问题讨论】:

  • 所以在订购时考虑到您的输出,您还会删除重复值吗?
  • @Marcos 不,没有重复值。每个像素只有一个阵列。所以我不想删除可能的重复值。如果您考虑该图像,数字更像是索引值。
  • 为什么希望结果是单项列表的列表,而不是简单的数字列表?
  • 从你的问题:“到这个[ [1],[2],[3],[4],[5]... ]”肯定是你真正想要的那些输入[ [1],[2],[3],[1],[2],... ]
  • @JimOldfield 更新了帖子并试图解释我的意思。希望它更有意义。

标签: python arrays list for-loop pixel


【解决方案1】:

与其尝试遍历数组索引然后索引到数组中,为什么不直接遍历它们呢?

vals = [ [[1],[2],[3]], [[1],[2],[3]], [[1],[2],[3]], [[1],[2],[3]] ]
result = []
for nested in vals:  # e.g. nested = [[1], [2], [3]]
    for more_nested in nested:  # e.g. more_nested = [1]
        val = more_nested[0]  # e.g. val = 1
        result.append([val])

运行后,result 包含:

[[1], [2], [3], [1], [2], [3], [1], [2], [3], [1], [2], [3]]

如果不需要在输出数组中创建 new 单项列表,您可以简化最后两行:

result.append(more_nested)

【讨论】:

  • 感谢您的回答。在这种情况下,您似乎无法展平阵列。我可能对这个问题描述得不好,所以我更新了图片和描述。
【解决方案2】:

你可以先把这个列表弄平,然后再排序

import itertools 
a = [ [[1],[2],[3]], [[1],[2],[3]], [[1],[2],[3]], [[1],[2],[3]] ]

b = list(itertools.chain(*a)) 
print(sorted(b))

上面代码的输出是:

[[1], [1], [1], [1], [2], [2], [2], [2], [3], [3], [3], [3]]

如果你不想排序,那么你可以使用

print(list(itertools.chain(*a)))

【讨论】:

  • 感谢您的想法。在这种情况下,排序不起作用。当我们需要按特定顺序排列时,它将对每个数组进行排序。我更新了描述,所以也许它更容易理解。
【解决方案3】:

最后,我设法将图像部分与循环嵌套数组结合在一起。虽然脚本本身并不是最漂亮的......我现在将这个答案标记为更正,但如果有人在这种情况下做得更好,我会改变它。

所以这是我在这种情况下使用的“怪物”:

final_image_pixels = []
for i in range(parts_count, 0, -1):
    for row in range(part_height):    
        part_switch = -1           
        px_counter = -1            
        for col in range(final_image_width):
            if col % part_width == 0:
                part_switch += 1
                px_counter = 0
            if i-1 == 0:
                px_arr = i-1 + part_switch
            else:
                px_arr = ((i-1) * parts_count) + part_switch
            target_pixel = row * part_width + px_counter
            final_image_pixels.append(part_pixels[px_arr][target_pixel])
            px_counter += 1 

结果:

如果您想进一步了解我在哪里使用此循环 check here。这是RenderFart blender addon 的一部分。

【讨论】: