Как найти индексы i-го по величине элемента n-мерного массива numpy? - PullRequest
0 голосов
/ 05 января 2019

Я знаю, как найти индексы максимального элемента n-мерного массива.

Давайте, к примеру:

a=np.asarray([[1,7,-4],[9,-11,-17]])

Тогда ( источник ):

from numpy import unravel_index
unravel_index(a.argmax(), a.shape)

возвращение:

(1, 0)

и действительно a[1,0] равно 9, что является самым высоким элементом в массиве a, поэтому мы хороши.


Я также могу выяснить, как найти индексы i-го по величине элемента одномерного массива numpy (, используя ):

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

i=3 # we want the third largest element, for example
a.argsort()[-i]

Возвращает 1, что хорошо, поскольку a[1]=3, который действительно является третьим по величине элементом a.


Я хотел бы объединить эти два. Так что, если у меня есть

a=np.asarray([[1,7,-4],[9,-11,-17]])

Я хотел бы получить вывод, сообщающий мне индексы i-го по величине элемента массива a, например, если i=3, вывод должен быть [0,0], поскольку a[0,0]=1 - это i-й (третий ) самый большой элемент a.

Как я могу это сделать?

Ответы [ 4 ]

0 голосов
/ 05 января 2019

Вы также можете использовать heapq.nlargest для уплощенного массива и получить минимум из самых больших i элементов. Это должно быть более эффективным, чем сортировка для большинства случаев:

import numpy as np
import heapq

a = np.asarray([[1, 7, -4], [9, -11, -17]])
i = 2

ith_largest = min(heapq.nlargest(i, a.flatten()))
x, y = np.where(a == ith_largest)
print(x, y)  # [0] [1]
0 голосов
/ 05 января 2019

Ну, чтобы получить индекс какой-то наибольший или любой другой, вы можете использовать где:

Добавление к ответу выше webDev :

import numpy as np
i=2

a=np.asarray([[1,7,-4],[9,-11,-17]])

flat=a.flatten()
flat.sort()
tryvalue= flat[-i]

i, j = np.where(a == tryvalue)
print(i,j)

Это даст вам:

[0] [1]

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

0 голосов
/ 05 января 2019

Амит Амола х ответ отлично. В случае, если кому-то нужен другой, я нашел это решение:

a=np.asarray([[1,7,-4],[9,-11,-17]])
flat=a.flatten()
flat.sort()
i=5

for k, p in enumerate(a):
    for j, q in enumerate(p):
        if q == flat[-i]:
            indices=[k,j]

print(indices)

Даю [1, 1], что хорошо.

0 голосов
/ 05 января 2019

Это простой способ сделать это.

import numpy as np
i=3
a=np.asarray([[1,7,-4],[9,-11,-17]])
flat=a.flatten()
flat.sort()
print(flat)
print(flat[-i])
i, j = np.where(a == flat[-i])
print(i,j)

Вы можете сгладить, а затем отсортировать. Это даст вам вывод, который вы хотите, основываясь на i-м по величине, т.е. i=3. Если вы введете i = 5, flat[-i] даст вам -11.

...