Использование numpy.where () для возврата индексов полного массива, где проверенное условие является нарезанным - PullRequest
3 голосов
/ 11 ноября 2011

У меня есть следующий массив 3 x 3 x 3 с именем a (комментарии будут иметь смысл после прочтения остальной части вопроса):

array([[[8, 1, 0],     # irrelevant 1 (is at position 1 rather than 0)
        [1, 7, 5],     # the 1 on this line is what I am after!
        [1, 4, 9]],    # irrelevant 1 (out of the "cross")

       [[4, 0, 1],     # irrelevant 1 (is at position 2 rather than 0)
        [1, 0, 1],     # I'm only after the first 1 on this line!
        [6, 2, 1]],    # irrelevant 1 (is at position 2 rather than 0)

       [[0, 2, 2],
        [0, 6, 7],
        [3, 4, 9]]])

, кроме того, у меня есть этот список индексовэто относится к «центральному кресту» указанной матрицы, называемому idx

[array([0, 1, 1, 1, 2]), array([1, 0, 1, 2, 1])]

РЕДАКТИРОВАТЬ: я называю это «крест», поскольку он отмечает центральный столбец и строку в следующем:

>>> a[..., 0]
array([[8, 1, 1],
       [4, 1, 6],
       [0, 0, 3]])

Я хотел бы получить индексы всех этих массивов, расположенных в idx, первое значение которых равно 1 , но я изо всех сил пытаюсь понять, как использовать numpy.where() в правомпуть.Поскольку ...

>>> a[..., 0][idx]
array([1, 4, 1, 6, 0])

... Я пытался ...

>>> np.where(a[..., 0][idx] == 1)
(array([0, 2]),)

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

[array([0, 1]), array([1, 1])]  #as a[0, 1, 0] and a [1, 1, 0] are equal to 1.

Заранее благодарю за помощь!

PS: В комментариях мне предложили попытаться дать более широкий сценарийприменимость.Хотя это не то, для чего я использую, я предполагаю, что это можно использовать для обработки изображений, как это делают многие 2D-библиотеки, с исходным слоем, целевым слоем и маской (см., Например, cairo ).В этом случае маска будет массивом idx, и можно будет представить работу с каналом R цветов RGB (a[..., 0]).

1 Ответ

5 голосов
/ 11 ноября 2011

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

>>> w = np.where(a[..., 0][idx] == 1)[0]
>>> array(idx).T[w]
array([[0, 1],
       [1, 1]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...