programing

Python: 인덱스 세트에 따라 목록에서 하위 집합 선택

telebox 2023. 4. 12. 22:13
반응형

Python: 인덱스 세트에 따라 목록에서 하위 집합 선택

모두 같은 수의 엔트리를 가진 리스트가 몇 개 있습니다(각각 오브젝트 속성을 지정).

property_a = [545., 656., 5.4, 33.]
property_b = [ 1.2,  1.3, 2.3, 0.3]
...

같은 길이의 깃발이 있는 목록입니다.

good_objects = [True, False, False, True]

(이는 동등한 지수 목록으로 쉽게 대체될 수 있다.

good_indices = [0, 3]

새 목록을 생성하는 가장 쉬운 방법은 무엇입니까?property_asel,property_bsel, ...에 의해 지정된 값만 포함됩니다.True엔트리와 인덱스 중 어느 쪽인가?

property_asel = [545., 33.]
property_bsel = [ 1.2, 0.3]

목록 이해만 사용할 수 있습니다.

property_asel = [val for is_good, val in zip(good_objects, property_a) if is_good]

또는

property_asel = [property_a[i] for i in good_indices]

후자가 더 빠릅니다. 왜냐하면 더 적기 때문입니다.good_indices의 길이보다 더property_a(전제)good_indices즉석에서 생성되는 것이 아니라 미리 계산됩니다.


편집: 첫 번째 옵션은 다음과 같습니다.itertools.compressPython 2.7/3.1부터 이용 가능합니다.@Gary Ker의 답변을 참조하십시오.

property_asel = list(itertools.compress(property_a, good_objects))

두 가지 선택지가 있네요.

  1. numpy 사용:

    property_a = numpy.array([545., 656., 5.4, 33.])
    property_b = numpy.array([ 1.2,  1.3, 2.3, 0.3])
    good_objects = [True, False, False, True]
    good_indices = [0, 3]
    property_asel = property_a[good_objects]
    property_bsel = property_b[good_indices]
    
  2. 목록 이해 기능을 사용하여 압축합니다.

    property_a = [545., 656., 5.4, 33.]
    property_b = [ 1.2,  1.3, 2.3, 0.3]
    good_objects = [True, False, False, True]
    good_indices = [0, 3]
    property_asel = [x for x, y in zip(property_a, good_objects) if y]
    property_bsel = [property_b[i] for i in good_indices]
    

내장된 함수 zip 사용

property_asel = [a for (a, truth) in zip(property_a, good_objects) if truth]

편집

2.7의 신기능을 소개합니다.이제 위의 코드와 유사한 기능이 반복 도구 모듈에 추가되었습니다.

http://docs.python.org/library/itertools.html#itertools.compress

itertools.compress('ABCDEF', [1,0,1,0,1,1]) =>
  A, C, E, F

항목 목록과 True/Required Index 목록만 있다고 가정하면 이것이 가장 빠릅니다.

property_asel = [ property_a[index] for index in good_indices ]

즉, 속성 선택은 true/required 인덱스의 수만큼만 라운딩을 수행합니다.단일 태그(true/false) 목록의 규칙을 따르는 속성 목록이 많은 경우 동일한 목록 이해 원칙을 사용하여 인덱스 목록을 만들 수 있습니다.

good_indices = [ index for index, item in enumerate(good_objects) if item ]

good_objects의 각 항목을 반복하고(Enumerate를 사용하여 인덱스를 기억하면서) 항목이 참인 인덱스만 반환합니다.


리스트의 이해를 얻지 못한 분들을 위해 굵은 글씨로 강조 표시된 영어 산문 버전을 다음에 제시하겠습니다.

항목이 True인 경우 양호개체 열거존재하는 모든 색인 그룹, 항목의 색인을 나열합니다.

Matlab과 Scilab 언어는 Python보다 심플하고 우아한 구문을 제공하므로 Python의 Numpy 패키지를 사용하여 Matlab/Scilab을 모방하는 것이 최선이라고 생각합니다.이렇게 하면 문제를 매우 간결하고 우아하게 해결할 수 있습니다.

from numpy import *
property_a = array([545., 656., 5.4, 33.])
property_b = array([ 1.2,  1.3, 2.3, 0.3])
good_objects = [True, False, False, True]
good_indices = [0, 3]
property_asel = property_a[good_objects]
property_bsel = property_b[good_indices]

Numpy는 Matlab/Scilab을 흉내내려고 하지만 비용이 많이 듭니다.이것은 스크립트를 과부하로 하는 키워드 「array」로 모든 리스트를 선언할 필요가 있습니다(이 문제는 Matlab/Scilab에서는 발생하지 않습니다).이 솔루션은 번호 배열로 제한되어 있습니다(예: 이 경우).

언급URL : https://stackoverflow.com/questions/3179106/python-select-subset-from-list-based-on-index-set

반응형