1
votes

Comment trouver les indices du i-ème plus grand élément d'un tableau numpy à n dimensions?

Je sais trouver les indices de l'élément maximum d'un tableau à n dimensions.

Prenons par exemple:

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

Then (source ):

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

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

retour:

(1, 0)


2 commentaires

stackoverflow.com/a/9483964/10708112 peut être utile.


oui, le problème est que je ne veux pas toujours le maximum (c'est-à-dire le 1er plus grand), mais le i-ème plus grand, ce que je ne peux pas faire avec a.argmax ().


4 Réponses :


1
votes

C'est un moyen simple de le faire.

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)

Vous pouvez l'aplatir puis le trier. Il vous donnera la sortie que vous voulez en fonction de votre ième plus grand, c'est-à-dire i = 3 . Si vous entrez i = 5, flat [-i] vous donnera -11.


3 commentaires

Cela me donnera 1, mais comment obtenir [0,0]?


oui, ça me donne en effet -11 si i = 5. Dans ce cas, j'aimerais avoir [1,1], car un [1,1] = - 11 est le 5ème plus grand élément du tableau.


Fonctionne en effet. Merci!



3
votes

Eh bien, pour obtenir l'index de certains des plus grands ou des deux, vous pouvez utiliser where:

Ajout de la réponse ci-dessus par webDev a>:

[0] [1]

Cela vous donnera:

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)

Je veux dire que vous pouvez apporter vous-même des modifications veulent que ces index soient comme (tuple ou autre).


1 commentaires

oui np.where () @Amit



0
votes

Amit Amola réponse est parfaitement bonne. Au cas où quelqu'un en aurait besoin d'un autre, j'ai trouvé cette solution:

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)

Donner [1, 1] , ce qui est bien.


2 commentaires

Enumerate garde une trace des index, mais zabop, le problème ici serait une boucle imbriquée. Je veux dire que si cela fonctionnait sur plusieurs valeurs à trouver, disons la plus grande valeur à trouver avec leurs index de 1 lakh de tels tableaux, cette boucle imbriquée gâcherait complètement la complexité. Alors, prenez soin de ce problème si vous travaillez sur des données plus volumineuses.


Oui, bon point, cela ne fonctionne bien que pour les petits tableaux de faible dimension.



1
votes

Vous pouvez également utiliser heapq.nlargest code > sur le tableau aplati et obtenez le minimum de ces éléments i plus grands. Cela devrait être plus efficace que le tri dans la plupart des cas:

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 commentaires