Применение операций с кортежами поэлементно к массиву кортежей - PullRequest
0 голосов
/ 13 марта 2019

Я работаю с двумерным массивом «пикселей» (rgb int tuples), и мне нужен эффективный способ применить несколько неповоротливых операций к каждому элементу. В частности, я пытаюсь найти пиксели в нескольких цветовых оттенках целевого цвета, чтобы позже выделить их с помощью numpy.nonzero

Использование циклов For для этого случая занимает десятки секунд, поэтому я стремлюсь применить крошечные операции поэлементно для достижения того же результата.

Я хочу подать заявку

Вычитание кортежа:

pixel_diff = numpy.subtract( pixel_a, pixel_b) 

Абсолютное значение кортежа:

pixel_abs = numpy.abs( pixel_diff )

Сравнение кортежей:

pixel_bool = pixel_abs < int_tolerance

Tuple all ():

is_similar = numpy.all(pixel_bool)

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

Ответы [ 2 ]

1 голос
/ 13 марта 2019

Вы можете преобразовать в эквивалентное неструктурированное представление (без дополнительных затрат на копирование базовых данных):

my_3dview_of_ints = my_2d_of_3tuples.view(dtype=int)

, где my_2d_of_3tuples - это ваштекущий структурированный массив (массив кортежей)

Затем вы можете выполнять обычные операции с массивными массивами в этом представлении, не сталкиваясь с ошибками типов.

Например, если ваш массив выглядит так:

 [[(207,  27, 185) ( 90, 197,  52) ( 58, 153, 145) (239,  42,  39)]
 [(218,  23, 195) (226,  92, 170) ( 21, 114, 190) (192, 145,  48)]]

тогда представление, как создано выше, будет выглядеть так:

[[[207  27 185]
  [ 90 197  52]
  [ 58 153 145]
  [239  42  39]]

 [[218  23 195]
  [226  92 170]
  [ 21 114 190]
  [192 145  48]]]

Например:

pixel_a = my_3dview_of_ints[0,0] # pixel [207,27,185] at [0,0]
pixel_b = my_3dview_of_ints[1,1] # pixel [226,92,170] at [1,1]

pixel_diff = numpy.subtract( pixel_a, pixel_b) # Gives [-12,-65,5]

Вы даже можете изменить определенные элементы ввид, и изменения будут автоматически отражаться в соответствующем месте в исходном структурированном массиве:

my_3dview_of_ints[3,3] = pixel_a # Assign [207, 27,185] to location [3,3]
1 голос
/ 13 марта 2019
   import numpy as np
   #create a RGB array of 1000x1000x3 and separate into colors
   R, G, B = np.random.randint(0, 255, size = (1000, 1000, 3))
   #find all pixels less than 100, 100, 100
   np.logical_and((R<100), (G<100), (B<100))

Вы можете изменить последнюю строку в соответствии с вашими потребностями цвета. Таким образом, последняя строка занимает около 1,5 мс на одном ядре.

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