Numpy: получить массив, где индекс больше, чем значение и условие истинно - PullRequest
3 голосов
/ 09 октября 2019

У меня есть следующий массив:

a = np.array([6,5,4,3,4,5,6])

Теперь я хочу получить все элементы, которые больше 4, но также имеют значение индекса больше 2. Способ, который я нашел, былследующее:

a[2:][a[2:]>4]

Есть ли лучший или более читабельный способ сделать это?

ОБНОВЛЕНИЕ : Это упрощенная версия. В действительности индексация выполняется с помощью арифметической операции над несколькими переменными, подобными этой:

a[len(trainPredict)+(look_back*2)+1:][a[len(trainPredict)+(look_back*2)+1:]>4]

trainPredict это простой массив, look_back целое число.
Я хотел посмотреть, есть ли установленныйспособ или как другие делают это.

Ответы [ 2 ]

3 голосов
/ 09 октября 2019

Если вас беспокоит сложность среза и / или количество условий, вы всегда можете разделить их:

a = np.array([6,5,4,3,4,5,6])

a_slice = a[2:]

cond_1 = a_slice > 4

res = a_slice[cond_1]

Ваш пример очень упрощен? Возможно, найдутся лучшие решения для более сложных манипуляций.

1 голос
/ 10 октября 2019

@ Ответ AlexanderCécile не только более разборчивый, чем тот, который вы опубликовали, но и устраняет избыточные вычисления временного массива. Несмотря на это, похоже, что он не работает быстрее, чем ваш первоначальный подход.

Все приведенные ниже тайминги запускаются с предварительной настройкой

import numpy as np
np.random.seed(0xDEADBEEF)
a = np.random.randint(8, size=N)

N, варьирующейся от 1e3 до 1e8в 10 раз. Я попробовал четыре варианта кода:

  1. CodePope: result = a[2:][a[2:] > 4]
  2. AlexanderCécile: s = a[2:]; result = s[s > 4]
  3. MadPhysicist1: result = a[np.flatnonzero(a[2:]) + 2]
  4. MadPhysicist2: result = a[(a > 4) & (np.arange(a.size) >= 2)]

Во всех случаях время было получено в командной строке путем запуска

python -m timeit -s 'import numpy as np; np.random.seed(0xDEADBEEF); a = np.random.randint(8, size=N)' '<X>'

Здесь N было степеньюот 10 между 3 и 8 и <X> одним из выражений выше. Времена следующие:

enter image description here

Методы № 1 и № 2 практически неразличимы. Что удивительно, так это то, что в диапазоне между ~ 5e3 и ~ 1e6 элементами метод № 3 выглядит немного, но заметно быстрее. Я бы не ожидал, что от модной индексации. Метод № 4, конечно, будет самым медленным.

Вот данные для полноты:

           CodePope  AlexanderCécile  MadPhysicist1  MadPhysicist2
1000       3.77e-06         3.69e-06       5.48e-06       6.52e-06
10000       4.6e-05         4.59e-05       3.97e-05       5.93e-05
100000     0.000484         0.000483         0.0004       0.000592
1000000     0.00513          0.00515        0.00503        0.00675
10000000     0.0529           0.0525         0.0617          0.102
100000000     0.657            0.658          0.782           1.09
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...