Jak mogę uzyskać drugą minimalną wartość z każdej kolumny? Mam tę tablicę:
A = [[72 76 44 62 81 31]
[54 36 82 71 40 45]
[63 59 84 36 34 51]
[58 53 59 22 77 64]
[35 77 60 76 57 44]]
Chcę mieć dane wyjściowe takie jak:
A = [54 53 59 36 40 44]
python
arrays
python-3.x
list
Pan Dan
źródło
źródło
Odpowiedzi:
Wypróbuj to, w jednej linii:
w akcji:
a jeśli masz zduplikowaną wartość, na przykład:
Jeśli musisz pominąć oba
35
, możesz użyćset()
:źródło
Operacje na
numpy
tablicach należy wykonywać za pomocąnumpy
funkcji, więc spójrz na to:źródło
numpy
, myślę, żelambda
musi spowolnićheapq.nsmallest
rozwiązanie. Najlepiej wydaje się trzymać wszystko szybkonumpy
możesz użyć heapq.nsmallest
wynik:
Dodałem prosty test porównawczy, aby porównać wydajność różnych już opublikowanych rozwiązań:
Korzystanie
zip
zsorted
funkcji jest najszybszym rozwiązaniem dla małych list 2d, a używaniezip
zheapq.nsmallest
programami jest najlepszym rozwiązaniem na dużych listach 2dźródło
Mam nadzieję, że dobrze zrozumiałem twoje pytanie, ale tak czy inaczej, oto moje rozwiązanie, jestem pewien, że jest bardziej elegancki sposób, ale to działa
źródło
Zakładając, że
A
taknumpy.array
(jeśli to prawda, rozważ dodanienumpy
tagu do pytania), możesz użyćapply_along_axis
tego w następujący sposób:Zauważ, że użyłem heapq.nsmallest, ponieważ wykonuje tyle sortowania, ile jest wymagane, aby uzyskać 2 najmniejsze elementy, w przeciwieństwie do tego,
sorted
które wykonuje pełne sortowanie.źródło
Zaktualizowano : Użyj,
set
aby zapobiec duplikowaniu i transponowaniu listy za pomocązip(*A)
stary: drugi minimalny element w każdym rzędzie
źródło