programing

python list 이해를 이용한 조건 기반 요소 인덱스 찾기

i4 2023. 8. 9. 20:30
반응형

python list 이해를 이용한 조건 기반 요소 인덱스 찾기

다음 Python 코드는 Matlab 배경에서 올 때 매우 긴 감김이 있는 것으로 보입니다.

>>> a = [1, 2, 3, 1, 2, 3]
>>> [index for index,value in enumerate(a) if value > 2]
[2, 5]

Matlab에서 다음을 쓸 수 있습니다.

>> a = [1, 2, 3, 1, 2, 3];
>> find(a>2)
ans =
     3     6

파이썬에서 이것을 쓰는 간단한 방법이 있습니까, 아니면 긴 버전을 고수하면 됩니까?


Python 구문에 대한 모든 제안과 설명에 감사드립니다.

numpy 웹사이트에서 다음을 찾은 후, 제가 좋아하는 해결책을 찾은 것 같습니다.

http://docs.scipy.org/doc/numpy/user/basics.indexing.html#boolean-or-mask-index-arrays

위의 문제에 해당 웹 사이트의 정보를 적용하면 다음과 같은 이점이 있습니다.

>>> from numpy import array
>>> a = array([1, 2, 3, 1, 2, 3])
>>> b = a>2 
array([False, False, True, False, False, True], dtype=bool)
>>> r = array(range(len(b)))
>>> r(b)
[2, 5]

그러면 다음이 작동할 것입니다(그러나 테스트할 파이썬 인터프리터가 없습니다).

class my_array(numpy.array):
    def find(self, b):
        r = array(range(len(b)))
        return r(b)


>>> a = my_array([1, 2, 3, 1, 2, 3])
>>> a.find(a>2)
[2, 5]

다른 방법:

>>> [i for i in range(len(a)) if a[i] > 2]
[2, 5]

일반적으로 는 이미 조리된 함수이지만 목록 이해는 일반적이므로 매우 강력한 솔루션입니다.어떤 것도 당신이 글을 쓰는 것을 방해하지 않습니다.findPython에서 기능하고 나중에 원하는 대로 사용합니다.예:

>>> def find_indices(lst, condition):
...   return [i for i, elem in enumerate(lst) if condition(elem)]
... 
>>> find_indices(a, lambda e: e > 2)
[2, 5]

여기서는 목록을 사용하여 Matlab을 모방합니다.생성기와 반복기를 사용하는 것이 더 파이썬적일 것입니다.

  • 합니다.[value for value in a if value > 2]일반적으로 인덱스를 처리하는 것은 최선의 방법으로 작업하지 않는다는 것을 의미합니다.

  • 만약 당신이 Matlab과 유사한 API가 필요하다면, 당신은 Matlab에서 영감을 많이 받은 Python의 다차원 배열과 수치 연산을 위한 패키지인 numpy를 사용할 것입니다.목록 대신 numpy 배열을 사용할 것입니다.

     >>> import numpy
     >>> a = numpy.array([1, 2, 3, 1, 2, 3])
     >>> a
     array([1, 2, 3, 1, 2, 3])
     >>> numpy.where(a > 2)
     (array([2, 5]),)
     >>> a > 2
     array([False, False,  True, False, False,  True], dtype=bool)
     >>> a[numpy.where(a > 2)]
     array([3, 3])
     >>> a[a > 2]
     array([3, 3])
    

저에게는 잘 작동합니다.

>>> import numpy as np
>>> a = np.array([1, 2, 3, 1, 2, 3])
>>> np.where(a > 2)[0]
[2 5]

아마도 또 다른 질문은 "그 지수들을 얻으면 어떻게 할 것인가?"일 것입니다.만약 당신이 그것들을 다른 목록을 만들기 위해 사용한다면, 파이썬에서 그것들은 불필요한 중간 단계입니다.지정된 조건과 일치하는 모든 값을 사용하려면 기본 제공 필터를 사용하십시오.

matchingVals = filter(lambda x : x>2, a)

목록을 직접 작성할 수도 있습니다.

matchingVals = [x for x in a if x > 2]

, 하는 것이 목록을 것처럼 이해를 , 약만당신고싶면다하제거, 파이썬방법것아은제, 라니사그작것목이만목새마록당는처성럼록하드해를고을운치로이신용을 입니다.listvar[:]왼쪽:

a[:] = [x for x in a if x <= 2]

매트랩 소모품find배열 중심 모델은 배열 인덱스를 사용하여 항목을 선택함으로써 작동하기 때문입니다.Python에서도 가능하지만, @EliBendersky가 이미 언급했듯이, Pythonic 방식은 반복기와 발전기를 사용하는 것입니다.

답이 늦더라도:이것은 여전히 매우 좋은 질문이며 IMHO Python(추가 라이브러리나 numpy와 같은 툴킷이 없음)은 수동으로 정의된 필터에 따라 목록 요소의 인덱스에 액세스할 수 있는 편리한 방법이 여전히 부족합니다.

다음과 같은 기능을 제공하는 함수를 수동으로 정의할 수 있습니다.

def indices(list, filtr=lambda x: bool(x)):
    return [i for i,x in enumerate(list) if filtr(x)]

print(indices([1,0,3,5,1], lambda x: x==1))

산출량: [0, 4]

제가 상상하기에 완벽한 방법은 목록의 하위 클래스를 만들고 클래스 방법으로 인덱스를 추가하는 것입니다.이러한 방식으로 필터 방법만 필요합니다.

class MyList(list):
    def __init__(self, *args):
        list.__init__(self, *args)
    def indices(self, filtr=lambda x: bool(x)):
        return [i for i,x in enumerate(self) if filtr(x)]

my_list = MyList([1,0,3,5,1])
my_list.indices(lambda x: x==1)

저는 여기서 그 주제에 대해 조금 더 자세히 설명했습니다: http://tinyurl.com/jajrr87

그러면 다음이 작동할 것입니다(그러나 테스트할 파이썬 인터프리터가 없습니다).

class my_array(numpy.array):
    def find(self, b):
        r = array(range(len(b)))
        return r(b)


>>> a = my_array([1, 2, 3, 1, 2, 3])
>>> a.find(a>2)
[2, 5]

그것은 좋은 해결책입니다.그러나 기본 제공 형식은 하위 분류되지 않습니다.상속 대신 구성을 사용할 수 있습니다.이렇게 하면 됩니다.

import numpy

class my_array:
    def __init__(self, data):
        self.data = numpy.array(data)

    def find(self, b):
        r = numpy.array(list(range(len(self.data))))
        return list(r[b])

>>> a = my_array([1, 2, 3, 1, 2, 3])
>>> a.find(a.data>2)  
[2,5]

언급URL : https://stackoverflow.com/questions/7270321/finding-the-index-of-elements-based-on-a-condition-using-python-list-comprehensi

반응형