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
2
에2
의 두 번째 는 '이러한 요소'입니다.2
3
에0
세는 '이러한 요소'입니다.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
'it-source' 카테고리의 다른 글
Maria를 사용하여 현지 시간 SQL 결과를 반환하는 방법DB (0) | 2022.12.09 |
---|---|
#1055 - SELECT 목록의 식이 GROUP BY 절에 없으며 집계되지 않은 열이 포함되어 있습니다. 이 열은 sql_mode=only_full_group_by와 호환되지 않습니다. (0) | 2022.12.09 |
참조 - 이 기호는 PHP에서 무엇을 의미합니까? (0) | 2022.12.09 |
python 스크립트의 실행을 프로그래밍 방식으로 중지하시겠습니까? (0) | 2022.12.09 |
Java Map에서의 최대값과 관련된 키 검색 (0) | 2022.12.09 |