«Поворот» упорядочения массива с numpy - PullRequest
0 голосов
/ 09 февраля 2020

Я пытаюсь выяснить, как сделать заказ в numpy такого рода ситуации:

Сначала я создал блоки изображений с двумя циклами for (только для примера):

cuts = 9 # This is for example, there could be much more blocks
for row in range(cuts):
    for column in range(cuts):
        block_min_x = (1 / cuts) * row
        block_max_x = (1 / cuts) * (row + 1)
        block_min_y = (1 / cuts) * column
        block_max_y = (1 / cuts) * (column + 1)

Затем я добавляю эти "блоки изображений" в массив с именами, такими как "img_1_1, img_1_2, img_1_3, img_2_1, img_2_2, img_2_3 ..." в этом порядке. Вот так это выглядит в массиве (пример с числами):

[6,7,8] [15,16,17] [24,25,26]
[3,4,5] [12,13,14] [21,22,23]
[0,1,2] [9,10,11]  [18,19,20]

Есть ли какой-то метод, чтобы упорядочить эти блоки с помощью numpy:

[0,1,2]     [3,4,5]     [6,7,8]
[9,10,11]   [12,13,14]  [15,16,17]
[18,19,20]  [21,22,23]  [24,25,26]

И здесь это изображение, чтобы показать его лучше, что я ищу:

Ordering Example Image

Я не уверен, есть ли какой-то термин для такого рода проблемы поэтому извинения не могут использовать правильные темы. Кажется, проблема в том, что нам нужно «повернуть по часовой стрелке» в таком порядке, как вы видите на синей линии в примере изображения. Так что вопрос в том, как заказать это в numpy? Также, если бы это могло измениться в циклах for, было бы хорошо знать.

Ответы [ 2 ]

1 голос
/ 09 февраля 2020

Использование numpy.rot90:

In [11]: a = np.array([[6,7,8],[3,4,5], [0,1,2]])

In [12]: b = np.array([[15,16,17], [12,13,14], [9,10,11]])

In [13]: c = np.array([[24,25,26], [21,22,23], [18,19,20]])

In [14]: print(np.array([a, b, c]))
[[[ 6  7  8]
  [ 3  4  5]
  [ 0  1  2]]

 [[15 16 17]
  [12 13 14]
  [ 9 10 11]]

 [[24 25 26]
  [21 22 23]
  [18 19 20]]]

In [15]: print(np.rot90([a, b, c]))
[[[ 0  1  2]
  [ 9 10 11]
  [18 19 20]]

 [[ 3  4  5]
  [12 13 14]
  [21 22 23]]

 [[ 6  7  8]
  [15 16 17]
  [24 25 26]]]
0 голосов
/ 13 февраля 2020

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

# Order rendered images (to 1, 2, 3, 4 from 3, 1, 2, 4)
rendered_images_ordered = []            
for y in range(parts_count, 0, -1):
    for x in range(parts_count):
        rendered_images_ordered.append(rendered_images[(y-1)+(x*parts_count)])

Вывод до :

['Fart_1_1.png', 'Fart_1_2.png', 'Fart_1_3.png', 'Fart_2_1.png', 'Fart_2_2.png', 'Fart_2_3.png', 'Fart_3_1.png', 'Fart_3_2.png', 'Fart_3_3.png']

Before

Выход после :

['Fart_1_3.png', 'Fart_2_3.png', 'Fart_3_3.png', 'Fart_1_2.png', 'Fart_2_2.png', 'Fart_3_2.png', 'Fart_1_1.png', 'Fart_2_1.png', 'Fart_3_1.png']

After

И если интересно больше о том, где Я использую это. Я создал это для дополнения blender под названием RenderFarts . Там мне нужно это упорядочить в функции слияния изображений , где я отрисовываю детали и нужно расположить их в правильном порядке. Процесс слияния еще не работает, но, похоже, этот порядок работает правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...