#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
). Спасибо! 🙂