L oop вложенных массивов с данными пикселей в один массив - PullRequest
0 голосов
/ 12 февраля 2020

Updated image

В этом примере у нас есть матрица массивов 2 * 2, но она может быть любой, например 4x4, 16x16.

например: we go через первую строку массива 1, а затем go через вторую строку массива 1. После того, как мы подошли к концу 2 последних элемента массива, мы переходим к третьему массиву и так далее. Мы знаем, что каждый массив (части изображения) содержит 64 столбца / строки (пикселя), поэтому для изображения размером 128 пикселей мы пропускаем через массив oop 2 и затем перемещаем нижние.

Какова формула для циклического перемещения по массивам? в таких сценариях ios?

Вот что я пытаюсь сделать, но не работаю ...

# 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]

Результат сейчас: (Эти цвета не относятся к описанию на изображении выше)

enter image description here

Должно быть:

enter image description here

Ответы [ 3 ]

0 голосов
/ 12 февраля 2020

Вместо того, чтобы пытаться перебирать индексы массива и затем индексировать массивы, почему бы не перебрать их напрямую?

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]]

Если нет необходимости создавать новые списки с одной записью в выходном массиве, вы можете упростить две последние строки:

result.append(more_nested)
0 голосов
/ 16 февраля 2020

Наконец, мне удалось объединить части изображения с циклическими вложенными массивами. Хотя сам сценарий не самый красивый ... Я отмечаю этот ответ, чтобы исправить его сейчас, но если кто-то работает лучше, который работает в этом контексте, я его поменяю.

Так что вот "монстр" что я использовал в этом случае:

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 

Результат:

Result

Если вы хотите чтобы узнать больше о том, где я использую этот l oop , проверьте здесь . Это часть аддона блендера RenderFart .

0 голосов
/ 12 февраля 2020

вы можете сначала сделать этот список плоским, а затем отсортировать его

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)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...