Найти индексы, в которых массив python становится положительным (но не отрицательным) - PullRequest
1 голос
/ 15 апреля 2020

У меня есть np.array, похожий на этот:

A = np.array([-1,-0.5,0.5,1,2,-2,-0.25,2,5])

Я хотел бы получить индексы, где массив переходит от отрицательного к положительному, но не в другую сторону вокруг (что будет достигнуто с помощью np.sign методов). Следовательно, мой желаемый результат будет только:

ind = [1,6]

До сих пор я пробовал вещи, похожие на этот ответ , но затем я также индексирую 4, что мне не нужно. Мой реальный массив довольно большой (около 10 тыс. Элементов), и изменение знака не является регулярным. Спасибо за вашу помощь!

Ответы [ 2 ]

1 голос
/ 15 апреля 2020

Спасибо @FBruzzesi за этот совет! Я следовал вашему логику c и использовал:

ch = np.where(A[:-1]*A[1:]<0)[0]
ch = ch[A[ch]<0]

, который мне легче читать, а также немного быстрее на моем компьютере. Использование timeit.repeat на 1000 итераций для массива с элементом 10k в среднем дает:

  • с использованием логических значений (ответ @FBruzzesi): 9.89E-02 se c
  • используя сравнение массивов (см. выше): 6.74E-02 se c

и, конечно, я удалил ответ tolist() на @FBruzzesi ради честного сравнения, поэтому два вывода - это массивы (Я не возражал против получения массива или списка, но спасибо за то, что подобрали эту деталь).

Еще раз спасибо!

1 голос
/ 15 апреля 2020

Вы можете одновременно проверить, что произведение последовательных элементов массива является отрицательным, а соответствующее значение отрицательным (следовательно, изменяется с отрицательного на положительное):

A = np.array([-1, -0.5, 0.5, 1, 2, -2, -0.25, 2, 5])

m1 = A[:-1]<0 
m2 = np.sign(A[1:]*A[:-1])==-1

r = np.argwhere(np.all(np.vstack([m1,m2]), axis=0))
ind = np.squeeze(r).tolist()

ind
[1, 6]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...