it-source

Python에서 정렬된 배열의 인덱스를 가져오는 방법

criticalcode 2022. 12. 9. 21:51
반응형

Python에서 정렬된 배열의 인덱스를 가져오는 방법

숫자 목록이 있습니다.

myList = [1, 2, 3, 100, 5]

하면, 「 」를 할 수 있습니다.[1, 2, 3, 5, 100]제가 원하는 것은 정렬된 순서대로 원래 목록의 요소 색인입니다. [0, 1, 2, 4, 3]를 모두 반환하는 MATLAB의 .--- " MATLAB" 입니다.

numpy를 사용하는 경우 argsort() 함수를 사용할 수 있습니다.

>>> import numpy
>>> numpy.argsort(myList)
array([0, 1, 2, 4, 3])

http://docs.scipy.org/doc/numpy/reference/generated/numpy.argsort.html

배열 또는 목록을 정렬할 인수를 반환합니다.

예를 들어 다음과 같습니다.

>>> myList = [1, 2, 3, 100, 5]
>>> [i[0] for i in sorted(enumerate(myList), key=lambda x:x[1])]
[0, 1, 2, 4, 3]

enumerate(myList) (: (, 값)의 튜플은 (index, value)입니다.

[(0, 1), (1, 2), (2, 3), (3, 100), (4, 5)]

, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다.sorted 키를하는 기능(각두 을lambda를 위한 것입니다.마지막으로 소트된 각 요소의 원래 인덱스를 추출한다.[i[0] for i in ...]일람표 이해

myList = [1, 2, 3, 100, 5]    
sorted(range(len(myList)),key=myList.__getitem__)

[0, 1, 2, 4, 3]

perfplot(프로젝트)로 퍼포먼스를 체크해 본 결과, 다른 것은 추천할 수 없습니다.

np.argsort(x)

(로그 스케일 메모):

여기에 이미지 설명 입력


플롯을 재현하는 코드:

import perfplot
import numpy as np


def sorted_enumerate(seq):
    return [i for (v, i) in sorted((v, i) for (i, v) in enumerate(seq))]


def sorted_enumerate_key(seq):
    return [x for x, y in sorted(enumerate(seq), key=lambda x: x[1])]


def sorted_range(seq):
    return sorted(range(len(seq)), key=seq.__getitem__)


b = perfplot.bench(
    setup=np.random.rand,
    kernels=[sorted_enumerate, sorted_enumerate_key, sorted_range, np.argsort],
    n_range=[2 ** k for k in range(15)],
    xlabel="len(x)",
)
b.save("out.png")

은 ★★★★★★★★★★★★★★★★★.enumerate값을 합니다.다음은 인덱스와 값을 반대로 하여 정렬합니다.먼저 값을 기준으로 정렬하고 다음으로 인덱스를 기준으로 정렬합니다.

sorted((e,i) for i,e in enumerate(myList))

이 갱신되었습니다.「」이 되었습니다.enumerate ★★★★★★★★★★★★★★★★★」itemgetter:

sorted(enumerate(a), key=lambda x: x[1])
# [(0, 1), (1, 2), (2, 3), (4, 5), (3, 100)]

목록을 압축합니다.첫인덱스를 하고 두 요소는의 두 합니다).x[1] x는 태플이다.

★★★★★★★★★★★★★★★★★itemgetter operator★★★★

from operator import itemgetter
sorted(enumerate(a), key=itemgetter(1))

으로는 '일부러'를 .argsort필요한 구현은 외부 라이브러리(NumPy 등)를 사용하는지 또는 종속성이 없는 순수 Python을 사용하는지에 따라 달라집니다.

자신에게 물어봐야 할 질문은 다음과 같습니다.원하십니까?

  • 배열/목록을 정렬하는 색인
  • 정렬된 배열/목록에서 요소가 가질 수 있는 인덱스

유감스럽게도 질문의 예에서는 두 가지 결과가 모두 같기 때문에 원하는 것이 무엇인지 명확히 알 수 없습니다.

>>> arr = np.array([1, 2, 3, 100, 5])

>>> np.argsort(np.argsort(arr))
array([0, 1, 2, 4, 3], dtype=int64)

>>> np.argsort(arr)
array([0, 1, 2, 4, 3], dtype=int64)

의 선택argsort

NumPy를 자유롭게 사용할 수 있다면 간단히 기능이나 방법을 사용할 수 있습니다.

NumPy를 사용하지 않는 구현은 이미 다른 답변에서 언급되었으므로 벤치마크 답변에 따라 가장 빠른 솔루션을 간략히 설명하겠습니다.

def argsort(l):
    return sorted(range(len(l)), key=l.__getitem__)

배열/목록을 정렬할 인덱스를 가져오는 중

"/"/"로 전화하면 .argsort배열 또는 목록에 있습니다.만, Python 결과를 얻을 수 있습니다.

>>> arr = np.array([3, 1, 2, 4])
>>> np.argsort(arr)
array([1, 2, 0, 3], dtype=int64)

결과에는 정렬된 배열을 가져오는 데 필요한 인덱스가 포함됩니다.

은 " " " 이므로" 이 됩니다.[1, 2, 3, 4] 요소의 가 포함되어 .

  • 은 「」입니다.1 지표에 .1의 첫 번째 는 '일단'입니다.1
  • 22의 두 번째 는 '이러한 요소'입니다.2
  • 30세는 '이러한 요소'입니다.0
  • 큰 값 " " "4 지표에 .3는 '이러한 요소'입니다.3.

정렬된 배열/목록에서 요소를 포함할 인덱스 가져오기

는 '어울리다'를 돼요.argsort 2회:

>>> arr = np.array([3, 1, 2, 4])
>>> np.argsort(np.argsort(arr))
array([2, 0, 1, 3], dtype=int64)

이 경우:

  • 의 첫 는 '원문'입니다.3은 세 큰 " " " " 가 2된 배열첫 번째 는 " "/"입니다.2.
  • 의 두 는 '원문'입니다.1에 지수를 수 0된 배열에서 두 는 " "/"입니다.0.
  • 의 세 는 '세 번째 요소'입니다.2은 두 값이기 수 1된 배열에서 세 는 "/"입니다.1.
  • 의 네 는 '네 번째 요소'입니다.4 큰 를 가질 수 .3는 "/"입니다.3.

numpy를 사용하지 않으려면

sorted(range(len(seq)), key=seq.__getitem__)

여기서 보여드렸듯이 가장 빠릅니다.

다른 답은 틀렸습니다.

.argsort한번은 해결책이 아니다.예를 들어 다음과 같은 코드가 있습니다.

import numpy as np
x = [3,1,2]
np.argsort(x)

율율array([1, 2, 0], dtype=int64)우리가 원하는 건 그게 아니야

은 '달리다' 입니다.argsort 2회:

import numpy as np
x = [3,1,2]
np.argsort(np.argsort(x))

array([2, 0, 1], dtype=int64)역시나

Numpy 패키지를 사용하는 가장 쉬운 방법은 다음과 같습니다.

import numpy
s = numpy.array([2, 3, 1, 4, 5])
sort_index = numpy.argsort(s)
print(sort_index)

단, 코드를 작성하려면 baisc python 코드를 사용해야 합니다.

s = [2, 3, 1, 4, 5]
li=[]
  
for i in range(len(s)):
      li.append([s[i],i])
li.sort()
sort_index = []
  
for x in li:
      sort_index.append(x[1])
  
print(sort_index)

0에서 n-1까지의 다른 인덱스 배열을 만듭니다.그 후 원래 배열로 압축한 후 원래 값을 기준으로 정렬합니다.

ar = [1,2,3,4,5]
new_ar = list(zip(ar,[i for i in range(len(ar))]))
new_ar.sort()

`

s = [2, 3, 1, 4, 5]
print([sorted(s, reverse=False).index(val) for val in s]) 

중복된 요소가 있는 목록에서도 작동합니다.

numpy를 np로 가져오기

인덱스용

S=[11,2,44,55,66,0,10,3,33]

r=np.argsort(S)

[output]=array([5, 1, 7, 6, 0, 8, 2, 3, 4])

argsort S의 인덱스를 정렬된 순서로 반환합니다.

가치를 추구하다

np.sort(S)

[output]=array([ 0,  2,  3, 10, 11, 33, 44, 55, 66])

코드:

s = [2, 3, 1, 4, 5]
li = []

for i in range(len(s)):
    li.append([s[i], i])
li.sort()
sort_index = []

for x in li:
    sort_index.append(x[1])

print(sort_index)

이거 먹어봐, 내 환호에 효과가 있었어!

먼저 목록을 다음과 같이 변환합니다.

myList = [1, 2, 3, 100, 5]

목록 항목에 색인 추가

myList = [[0, 1], [1, 2], [2, 3], [3, 100], [4, 5]]

다음:

sorted(myList, key=lambda k:k[1])

결과:

[[0, 1], [1, 2], [2, 3], [4, 5], [3, 100]]

언급URL : https://stackoverflow.com/questions/6422700/how-to-get-indices-of-a-sorted-array-in-python

반응형