2014-10-02 5 views
2

각 행에 고유 인덱스 (음수가 아닌 정수)가있는 2D NumPy 배열 (N, D)이 있습니다. 행의 인덱스가 증가하고 있습니다. 예를 들어 내 (4,D) 배열의 인덱스는 (10, 20, 21, 30) 일 수 있습니다. 그들의 인덱스에서NumPy 인덱싱 된 배열의 데이터 구조

  • 선택 행 : arr[21] 대신의 arr[2] (즉, 절대보다는 상대 색인)

  • 가 임의의 변환

    나는 나를 수있는 데이터 구조를 찾고 있어요 상대 색인에 대한 절대 색인 목록 및 그 반대로. 예를 들어, [10, 30, 21, 21][0, 3, 2, 2] 사이에서 앞뒤로 변환하십시오.

이것을 구현하는 가장 깨끗한 방법은 무엇입니까?

  1. 새로운 클래스를 생성하고 데이터 (NumPy 배열) 및 색인을 래핑합니다. __getitem__, __setitem__ 등을 구현하는 것

  2. ndarray에서 파생 된 클래스를 작성하고 절대 색인이 사용되도록 색인을 겹쳐 쓰십시오.

  3. select(data, index)과 같은 기능을 구현하고 코드의 모든 부분을 사용하여 데이터와 색인 (NumPy 배열 모두)에 대해 별도의 개체를 유지합니다.

  4. 등 (3) 만, 인덱스는 마스크 배열을 이용하고 index.to_relative(data)index.to_absolute(data)

  5. 같은 방법을 제공하는 사용자 클래스의 인스턴스이다.

다른 접근법을 찾을 수있을 것입니다. 나는 이러한 모든 접근법에 찬부 양론을 찾을 수있다. 가장 깨끗한 방법은 무엇입니까? 내가 알지 못하는 "표준"방법이 있습니까?

+0

이 질문을 이해할 수 없습니다. '(N, D)'라고 할 때, N 차원 배열을 가지고 있다는 것을 의미합니까? 그리고 인덱스가'(10, 20, 21, 30) '이 될 수 있다고 말하면 배열의 모양을 의미합니까? 당신이하려는 일의 예와 그것이 어떻게 작동하지 않는지에 대한 예를 제공해 줄 수 있습니까? – farenorth

+0

3. 함수를 사용하는 것이 가장 간단합니다.그러나 인덱스 표기 ('[]')와 인자 표기법을 선호한다면,'np.lib.index_tricks'는 커스텀'__getitem__' 함수를 구현하는 클래스의 예제를 가지고 있습니다. – hpaulj

+0

@farenorth 질문을 명확히했습니다. 내 배열은 2 차원이고, 모양은'(N, D)'입니다. '(10, 20, 21, 30)'은 행과 관련된 임의의 정수입니다 (이 경우 네 개의 행이 있으므로 N = 4). 모든 5 가지 접근법을 구현하는 방법을 알고 있지만 어떤 것이 가장 깨끗한 지 잘 모릅니다. –

답변

0

표준 방법이 없다고 생각하지만 구현하기가 지나치게 복잡하지 않습니다. 사용 할당 할 수 없습니다 물론

i = [10,20,21,30] 
x = numpy.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]]) 
x[i.index(20)] # -> array([4,5,6]) 

: 대신 배열의 인덱스 목록을 사용하는 경우

는 (3), 당신은 값의 인덱스를 얻기 위해 index 방법을 사용할 수 있습니다 이것과 구조를 수정하는 것은 고통 스러울 수 있습니다.

프로그램의 복잡도에 따라 제안한대로이 코드를 직접 사용하거나 캡슐화하는 클래스를 만듭니다. 첫 번째 메소드는 다른 함수 나 클래스 정의를 필요로하지 않으므로 두 메소드 모두 "깨끗한"것으로 규정 될 수 있다고 생각합니다. 두 번째 메소드는 사용을 매우 쉽고 직관적으로 만듭니다.

+1

나는 내 배열이 매우 큽니다 (N은 1 억 개의 요소를 가질 수 있고 D는 1과 1000 사이가 될 수 있음), 상대 좌표와 절대 좌표 사이에서 수백만 개의 인덱스를 변환해야 할 수도 있습니다. 나는'list.index'가 어떻게이 볼륨들로 확장 될지 모르겠습니다. –

관련 문제