Используя python, как получить доступ и выполнить художественные операции над 'n' no.of сегментами в массиве, если их координаты доступны? - PullRequest
0 голосов
/ 12 апреля 2019

Следующий пример ясно иллюстрирует мой вопрос:

предположим, что это массив 'arr'

 >>import numpy as np
 >>from skimage.util.shape import view_as_blocks
 >>arr=np.array([[1,2,3,4,5,6,7,8],[1,2,3,4,5,6,7,8],[9,10,11,12,13,14,15,16],[17,18,19,20,21,22,23,24]])
  >>arr
  array([[ 1,  2,  3,  4,  5,  6,  7,  8],
           [ 1,  2,  3,  4,  5,  6,  7,  8],
           [ 9, 10, 11, 12, 13, 14, 15, 16],
           [17, 18, 19, 20, 21, 22, 23, 24]])

Я сегментировал этот массив на 2 * 2 блока, используя:

>>img= view_as_blocks(arr, block_shape=(2,2))
>>img
array([[[[ 1,  2],
         [ 1,  2]],

        [[ 3,  4],
         [ 3,  4]],

        [[ 5,  6],
         [ 5,  6]],

        [[ 7,  8],
         [ 7,  8]]],


       [[[ 9, 10],
         [17, 18]],

        [[11, 12],
         [19, 20]],

        [[13, 14],
         [21, 22]],

        [[15, 16],
         [23, 24]]]])

У меня есть другой массив "cor"

>>cor
(array([0, 1, 1], dtype=int64), array([2, 1, 3], dtype=int64))

В "cor" 1-й массив ([0,1,1]) дает координаты строк, а 2-й массив ([2,1,3]) дает координаты соответствующих столбцов в последовательном порядке.

Теперь моя работа состоит в том, чтобы получить доступ к сегментам img, позиционные координаты которых [0,2], [1,1] и [1,3] (взяты из «cor». X из 1-го массива и соответствующие y из 2-го массива ) автоматически, читая "кор".

В приведенном выше примере

img[0,2]= [[ 5,  6],    img[1,1]= [[11, 12],        img[1,3]=[[15, 16],
           [ 5,  6]],              [19, 20]]                  [23, 24]]

затем найдите среднее значение каждого сегмента отдельно.

ie. img[0,2]=5.5  img[1,1]=15.5 img[1,3]=19.5

Теперь проверьте, что его средние значения меньше среднего значения всего массива "img". Здесь среднее значение img составляет 10,5. следовательно, только среднее значение img [0,2] меньше 10,5. Поэтому, наконец, верните координату сегмента img [0,2], т. Е. [0,2], как вывод в последовательном порядке, если в любом другом большом массиве существует больше сегментов.

##expected output for above example:
[0,2]

1 Ответ

1 голос
/ 12 апреля 2019

Нам просто нужно проиндексировать с помощью cor и выполнить эти mean вычисления (по двум последним осям) и проверить -

# Convert to array format
In [229]: cor = np.asarray(cor)

# Index into `img` with tuple version of `cor`, so that we get all the
# blocks in one go and then compute mean along last two axes i.e. 1,2.
# Then compare against global mean - `img.mean()` to give us a valid
# mask. Then index into columns of `cor with it, to give us a slice of
# valid `cor`. Finally transpose, so that we get per row valid indices set.
In [254]: cor[:,img[tuple(cor)].mean((1,2))<img.mean()].T
Out[254]: array([[0, 2]])

Другой способ настроить это - разделить индексы -

In [235]: r,c = cor

In [236]: v = img[r,c].mean((1,2))<img.mean() # or img[cor].mean((1,2))<img.mean()

In [237]: r[v],c[v]
Out[237]: (array([0]), array([2]))

То же, что и в первом подходе, с той лишь разницей, что используются разделенные индексы для индексации в cor и получения окончательных индексов.


Или компактная версия -

In [274]: np.asarray(cor).T[img[cor].mean((1,2))<img.mean()]
Out[274]: array([[0, 2]])

В этом решении мы напрямую вводим исходную версию кортежа cor, остальное - то же, что и в подходе № 1.

...