#python #arrays #numpy #boolean-logic #object-slicing
#python #массивы #numpy #boolean-logic #объектно-нарезка
Вопрос:
Мне нужно нарезать массив координат xyz на основе условий в логическом массиве (где логический массив равен 1D).
Если мой логический массив равен
[1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1]
Мне нужно, чтобы он нарезал его для создания следующих индексных массивов:
[0, 1, 2, 3, 6, 7, 10, 11, 12] ([:-2] между истинными индексами)
Конечным желаемым результатом был бы массив координат xyz по этим индексам:
[xyz[0], xyz[1], xyz[2], xyz[3], xyz[6], xyz[7], xyz[10], xyz[11], xyz[12]]
Два других фрагмента (с аналогичными желаемыми результатами) являются следующими:
[1, 2, 3, 4, 7, 8, 11, 12, 13] ([1:-1] между истинными индексами)
[2, 3, 4, 5, 8, 9, 12, 13, 14] ([2:] между истинными индексами)
Есть ли pythonic способ сделать это без понимания списка?
Спасибо!
Комментарии:
1. Каким должен быть результат этого «среза», например, какой результат ожидается для
[0, 1, 2, 3, 6, 7, 10, 11, 12] ([:-2] between True indices)
?2. Индексы — это выходные данные (я думаю). Конечная цель — изолировать интересующие xyz координаты по этим индексам. Я отредактирую вопрос для ясности
3. Почему без понимания списка? Это, вероятно, самый питонический способ
4. Я пытаюсь векторизовать большую часть кода, поэтому я стараюсь избегать понимания списка, где это возможно, и максимально полагаться на отображение. Некоторые понимания списка неизбежны, я просто хотел узнать, есть ли в этом случае лучший способ.
Ответ №1:
Похоже, numpy.ndarray.nonzero
это то, что вам нужно:
a = np.asarray([1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1])
print(a.nonzero())
Выводит:
array([ 0, 5, 6, 9, 10, 14])