2012-03-27 3 views
5

Python3/Numpy에 배열을 필터링하고 남겨진 요소의 인덱스를 반환하는 내장 함수가 있습니까? 정렬을 위해 numpy.argsort와 비슷한 점이 있습니다. 필자가 가지고있는 필터는 최소 및 최대 임계 값을 모두 설정하고 있습니다. min/max보다 작은 값이나 작은 값은 모두 필터링해야합니다.Python3/Numpy에서 배열을 필터링하고 인덱스를 반환합니다.

저는 파이썬의 함수 filter을 보았습니다 만, 그것을 사용하여 인덱스를 추출하는 방법을 보지 못했습니다.

EDITED : 답안에 유용한 정보가 많이 있습니다. 감사합니다. @SvenMarnach는 지적

, 마스크는 충분하다 :

mask = (min_value < a) & (a < max_value) 

는 지금은 a 같은 모양의 다른 배열이 마스크를 적용해야하지만, 확실하지 그것을 할 수있는 가장 좋은 방법은 무엇입니까. ..

답변

4

indices = ((min_value < a) & (a < max_value)).nonzero()[0] 
으로 max_value보다보다 min_value 레를 있다는 일차원 배열 a의 요소의 인덱스를 얻을 수있다 0

보통 당신은하지만, 그 인덱스가 필요하지 않습니다,하지만 당신은 마스크

mask = (min_value < a) & (a < max_value) 

이 마스크는 a와 같은 모양을 가진 부울 배열보다 효율적으로 작업 할 수 있습니다.

편집 : 당신이 a와 같은 형태의 배열 b이있는 경우,

b[mask] 
+0

좋아요! 빠른 답장을 보내 주셔서 감사합니다. 실제로 마스크는 충분하지만 어떻게이 마스크를 'a'와 같은 모양의 다른 배열에 적용합니까? – Katya

+0

@Katya 그게 무슨 뜻일까요? 특정 마스크가있는 5x5 배열이 있다면 4x3 또는 6x6 배열에 적용 할 수있는 것을 정의 할 수 있습니까? – Hooked

+0

@Katya : "이 마스크 적용"이란 무엇을 의미합니까? 해당 요소를 추출 하시겠습니까? 나는 그 대답에 대한 문장을 추가했다. –

4

명령 후 numpy.wherewill return the indices of an arraymaskTrue 항목에 해당하는 b의 요소를 추출 할 수 있습니다 ' 그들 위에 가면을 대었다. 예를 들어 :

import numpy as np 
A = np.array([1,2,3,6,2]) 
np.where(A>2) 

을 제공합니다

(array([2, 3]),) 

더 복잡한 예제 :

A = np.arange(27).reshape(3,3,3) 
np.where((A>10) & (A<15)) 

이 제공 :

(array([1, 1, 1, 1]), array([0, 1, 1, 1]), array([2, 0, 1, 2])) 

내가 당신에게 보통 @SvenMarnach에 동의합니다 ne 인덱스.

+0

나는 이것을 보았을 때'where'의 버전을 만들었습니다. 한숨. – senderle

+0

@sendle 아마 너무 느립니다. 내가'numpy/scipy'의 모든 힘을 안다고 생각할 때마다,이 사이트는 내가 틀렸다는 것을 보여줍니다. – Hooked

1

저는 Sven의 답변을 많이 좋아합니다. 실제로는 numpy.where이 정확히 원하는 것을 수행합니다. Hooked는 나를 상기 시켰습니다. 하지만 대부분은 이미 그것을 썼기 때문에 몇 가지 트릭을 설명하기위한 또 다른 접근 방법이 있습니다.예를 들어

def my_filter(a): 
    return (10 < a) & (a < 40) 

a_mask = my_filter(a) 
indices = [ind[a_mask] for ind in numpy.indices(a.shape)] 

: my_filter 입력과 동일한 형상의 부울 배열을 반환하는 함수가 될 수

>>> a = numpy.arange(100).reshape((10, 10)) 
>>> def my_filter(a): 
...  return (min_value < a) & (a < max_value) 
... 
>>> a_mask = my_filter(a) 
>>> [ind[a_mask] for ind in numpy.indices(a.shape)] 
[array([1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 
     3, 3, 3, 3, 3, 3]), 
array([1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 
     4, 5, 6, 7, 8, 9])] 
4

직접 질문과 관련된 아니지만, filter() 세 세트의 일부 기능, map(), filter()reduce()으로, 파이썬에서 기능 스타일 목록 처리가 가능합니다.

  • map(mapping_function, input_list)는 하나의 인자와리스트의 함수에 걸리는 차례로리스트의 각 요소에 함수를 적용하고, 그 결과로 출력리스트를 반환한다. 목록 이해력 [mapping_function(item) for item in input_list]과 다소 비슷합니다.

  • filter(filter_function, input_list)filter_functionTrue을 반환하는 input_list의 요소 목록을 반환합니다. 목록 이해력은 [item for item in items if filter_function(item)]입니다.

  • reduce(combining_function, input_list)은 하나의 값만 남을 때까지 입력 목록에서 인접한 요소 쌍을 반복적으로 결합합니다. 예를 들어, 숫자 목록의 합은 reduce(operator.add, numbers)으로 표현 될 수 있습니다.

map()filter()의 기능을합니다 (mapfilter 기능은 자주 사용되지 않는 이유입니다.) 파이썬에서 지능형리스트에 의해 제공됩니다

reduce()은 '아무튼 그런 것들 중 하나입니다 직관적 인 대답을 제안합니다. 루프를 작성하는 것이 거의 항상 명확하며, 왜 그렇게 자주 보이지 않는지 설명합니다.

관련 문제