Использование numpy.where() для возврата индексов полного массива, в котором проверяемое условие находится в разрезанном виде

#python #numpy #python-2.7

#python #numpy #python-2.7

Вопрос:

У меня есть следующий массив numpy размером 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. Не очень полезно загружать вопрос с принятым ответом (= вопрос был понят) без объяснения причин. Меня не волнуют -2 балла, но искренне: без комментариев = понятия не имею, что я сделал не так! 🙁

2. Я предоставил отрицательный результат. «Полезность» моего отрицательного отзыва связана с ясностью вопроса и его потенциальной актуальностью для других пользователей, которая, на мой взгляд, невелика.

3. @Benjamin — Посмотрите, помогло ли последнее редактирование (в конце вопроса). Что касается ясности, не стесняйтесь редактировать вопрос [Я вижу из вашего профиля, что есть большая вероятность, что у вас английский в качестве родного языка]. Я думаю, "I want to know the indexes of all those arrays located at idx whose first value is 1" это лучшее, что я могу сделать с точки зрения английского языка ! 🙂

Ответ №1:

Вы можете преобразовать индексы обратно с помощью idx :

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

Комментарии:

1. Ваше решение работает безупречно даже с матрицами разной формы и разными масками ( idx ). Спасибо! 🙂