IndexError при выполнении операции argsort над массивом - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть 2 Numpy массива длиной 107952899.

  1. a = []
  2. b = []

Я хочу найти индексы внутримассив a, который больше 20. Я сохраняю этот результат в переменной c:

c = np.where(a > 20)

Затем, используя c (в котором хранятся индексы), я хочу найти значениявнутри массива NumPy b относительно соответствующих индексов.Я сохраняю это в d:

d = b[c]

Затем я хочу, чтобы верхние n максимальные элементы были в d с фактическими индексами.С этими индексами я буду выполнять дальнейшие вычисления.

d.argsort([-N])[::-1]

Я пытался использовать argsort, но получаю следующую ошибку:

IndexError: Invalid index to scalar value

Итак, подведу итог:2 массиваВ первом массиве я должен отфильтровать значения, которые больше 20. Затем я должен найти соответствующие значения во втором массиве, используя отфильтрованные индексы первого массива.После этого мне нужно отсортировать второй массив в порядке убывания и получить эти индексы для дальнейших вычислений.

Я попробовал описанный выше метод, введя эти массивы в Pandas DataFrame, и хотя он работает нормально, я предпочитаю делать это напрямую.

Каков наилучший способ сделать это?

1 Ответ

0 голосов
/ 07 февраля 2019

Попробуйте использовать что-то вроде этого:

Сначала преобразуйте ваш массив d в массив Numpy, если он еще не один

d_arr = np.asarray(d)

Затем вы можете использовать numpy.argpartition метод для получения индексов n самых больших значений

idx = np.argpartition(d_arr, -N)[-N:]

Чтобы получить индекс N самых больших элементов в вашем массиве.Затем вы можете сделать

d_arr[idx]

, чтобы получить данные об этих элементах.

Тест, который я использовал для подтверждения того, что этот метод работает:

a = np.array([1,2,4,6,7,8,9,9,9,7,4])
idx = np.argpartition(a, -5)[-5:]

print(idx)
[4 5 8 7 6]

print(a[idx])
[7 8 9 9 9]

Для больших массивов:Я бы придерживался метода numpy.argpartition над numpy.argsort на основе сравнительного теста здесь, поскольку он показывает numpy.argpartition в два раза быстрее, чем numpy.argsort .

...