Нарезка массивов на основе логического массива в python

#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])