2011-04-23 4 views
3

나는 100 개의 원소 배열을 가지고 있다고 가정 해 봅시다. 이 배열의 하위 집합에 대해 몇 가지 계산을 수행합니다. 일부 조건이 충족되는 20 개의 요소가있을 수 있습니다. 그런 다음이 하위 집합에서 인덱스를 선택합니다. 어떻게 첫 번째 배열에서 인덱스를 효율적으로 복구 할 수 있습니까? 비싸기 때문에 모든 값에 대한 계산을 수행하고 싶지 않으므로 필요한 경우에만 (조건이 충족되는 경우) 수행하고 싶습니다. 여기 Python/Numpy - 서브 세트에서 주 배열로 인덱스 가져 오기

가 무슨 뜻인지 보여주기 위해 일부 의사입니다합니다 ('조건'여기에 지능형리스트입니다) :

a = np.arange(100)         # size = 100 
b = some_function(a[[i for i in range(0,100,5)]]) # size = 20 
Index = np.argmax(b) 

# Index gives the index of the maximum value in b, 
# but what I really want is the index of the element 
# in a 

편집 : 나는 매우 명확되는, 그래서하지 않은

더 완전한 예제를 제공했습니다. 이것이 나의 목표가 무엇인지에 대해 더 명확하게하기를 바랍니다. 몇 가지 루프 나 조회없이 이것을 할 수있는 영리하고 효율적인 방법이있는 것처럼 느껴집니다.

CODE : 어레이를 변경 한 전에

import numpy as np 

def some_function(arr): 
    return arr*2.0 

a = np.arange(100)*2.        # size = 100 
b = some_function(a[[i for i in range(0,100,5)]]) # size = 20 
Index = np.argmax(b) 

print Index 
# Index gives the index of the maximum value in b, but what I really want is 
# the index of the element in a 

# In this specific case, Index will be 19. So b[19] is the largest value 
# in b. Now, what I REALLY want is the index in a. In this case, that would 
# 95 because some_function(a[95]) is what made the largest value in b. 
print b[Index] 
print some_function(a[95]) 

# It is important to note that I do NOT want to change a. I will perform 
# several calculations on SOME values of a, then return the indices of 'a' where 
# all calculations meet some condition. 
+0

질문을 이해할 수 있을지 모르지만 두 번째 단계에서 계산 된 20 가지 색인을 찾고 싶습니까? 최종'Index'는 어떻게 그것과 관련이 있습니까? – ejel

+0

@ejel : 설명하려고하면, some_function이 입력 배열을 무시하고 입력과 길이가 같은 임의의 interger 배열을 반환한다고 가정 해 보겠습니다. 그리고 나서'Index'는 가장 큰 (임의의) 숫자를 가진 b에 인덱스를 포함합니다. b의 인덱스는 a의 일부 인덱스에 실제로 해당하며 해당 인덱스는 내가 원하는 것입니다. –

답변

2

내가 질문을 이해한다면 확실하지 않다. 그래서 내가 틀렸다면 정정 해주세요.

의 당신이 마스크와 함께 일하고 싶어하지 않는

a = np.arange(100) 
condition = (a % 5 == 0) & (a % 7 == 0) 
b = a[condition] 
index = np.argmax(b) 
# The following should do what you want 
a[condition][index] 

경우 또는 같은 있다고 가정 해 봅시다 :

a = np.arange(100) 
b_indices = np.where(a % 5 == 0) 
b = a[b_indices] 
index = np.argmax(b) 
# Get the value of 'a' corresponding to 'index' 
a[b_indices][index] 

이 당신이 원하는 무엇입니까?

+0

더 명확하게하기 위해 제 질문을 업데이트했습니다. 당신의 코드에서'a [condition] [index]'는 a의 값을 반환하지만, a는 INDEX를 원하므로 a [INDEX] = a [condition] [index]'입니다. 조건과 색인에서 INDEX를 얻는 쉬운 방법이 있습니까? 나는 거기 있다고 상상한다. 그러나 그것은 나에게 명백하지 않다. –

+2

'np.arange (len (a)) [조건] [index]'아마도? –

+0

감사합니다. –

0

는 일반적으로 당신이 조건에 따라 인덱스를 저장하는 것입니다. 인덱스를 사용하여 변경합니다. a 여전히 b의 데이터를 소유하고 있음을 알 수있다

>>> b = a[2:4,2:7] 
>>> b 
array([[ 0.16324907, 0.20751965, 0.15903343], 
     [ 0.67676172, 0.67871825, 0.01849056]]) 

:

>>> b.base 
array([[ 0.22481885, 0.80522855, 0.1081426 , 0.42528799, 0.64471832], 
     [ 0.28044374, 0.16202575, 0.4023426 , 0.25480368, 0.87047212], 
     [ 0.84764143, 0.30580141, 0.16324907, 0.20751965, 0.15903343], 
     [ 0.55861168, 0.64368466, 0.67676172, 0.67871825, 0.01849056], 
     [ 0.90980614, 0.95897292, 0.15649259, 0.39134528, 0.96317126], 
     [ 0.20172827, 0.9815932 , 0.85661944, 0.23273944, 0.86819205], 
     [ 0.98363954, 0.00219531, 0.91348196, 0.38197302, 0.16002007], 
     [ 0.48069675, 0.46057327, 0.67085243, 0.05212357, 0.44870942], 
     [ 0.7031601 , 0.50889065, 0.30199446, 0.8022497 , 0.82347358], 
     [ 0.57058441, 0.38748261, 0.76947605, 0.48145936, 0.26650583]]) 

>>> a = np.random.random((10,5)) 
>>> a 
array([[ 0.22481885, 0.80522855, 0.1081426 , 0.42528799, 0.64471832], 
     [ 0.28044374, 0.16202575, 0.4023426 , 0.25480368, 0.87047212], 
     [ 0.84764143, 0.30580141, 0.16324907, 0.20751965, 0.15903343], 
     [ 0.55861168, 0.64368466, 0.67676172, 0.67871825, 0.01849056], 
     [ 0.90980614, 0.95897292, 0.15649259, 0.39134528, 0.96317126], 
     [ 0.20172827, 0.9815932 , 0.85661944, 0.23273944, 0.86819205], 
     [ 0.98363954, 0.00219531, 0.91348196, 0.38197302, 0.16002007], 
     [ 0.48069675, 0.46057327, 0.67085243, 0.05212357, 0.44870942], 
     [ 0.7031601 , 0.50889065, 0.30199446, 0.8022497 , 0.82347358], 
     [ 0.57058441, 0.38748261, 0.76947605, 0.48145936, 0.26650583]]) 

그리고 b이 부분 배열입니다 : a 만약

은 배열입니다를 모두 변경할 수 있습니다.및 b의 두 가지 방법 :

>>> b+=1 
>>> b 
array([[ 1.16324907, 1.20751965, 1.15903343], 
     [ 1.67676172, 1.67871825, 1.01849056]]) 
>>> a 
array([[ 0.22481885, 0.80522855, 0.1081426 , 0.42528799, 0.64471832], 
     [ 0.28044374, 0.16202575, 0.4023426 , 0.25480368, 0.87047212], 
     [ 0.84764143, 0.30580141, 1.16324907, 1.20751965, 1.15903343], 
     [ 0.55861168, 0.64368466, 1.67676172, 1.67871825, 1.01849056], 
     [ 0.90980614, 0.95897292, 0.15649259, 0.39134528, 0.96317126], 
     [ 0.20172827, 0.9815932 , 0.85661944, 0.23273944, 0.86819205], 
     [ 0.98363954, 0.00219531, 0.91348196, 0.38197302, 0.16002007], 
     [ 0.48069675, 0.46057327, 0.67085243, 0.05212357, 0.44870942], 
     [ 0.7031601 , 0.50889065, 0.30199446, 0.8022497 , 0.82347358], 
     [ 0.57058441, 0.38748261, 0.76947605, 0.48145936, 0.26650583]]) 

또는 :

>>> a[2:4,2:7]+=1 
>>> a 
array([[ 0.22481885, 0.80522855, 0.1081426 , 0.42528799, 0.64471832], 
     [ 0.28044374, 0.16202575, 0.4023426 , 0.25480368, 0.87047212], 
     [ 0.84764143, 0.30580141, 1.16324907, 1.20751965, 1.15903343], 
     [ 0.55861168, 0.64368466, 1.67676172, 1.67871825, 1.01849056], 
     [ 0.90980614, 0.95897292, 0.15649259, 0.39134528, 0.96317126], 
     [ 0.20172827, 0.9815932 , 0.85661944, 0.23273944, 0.86819205], 
     [ 0.98363954, 0.00219531, 0.91348196, 0.38197302, 0.16002007], 
     [ 0.48069675, 0.46057327, 0.67085243, 0.05212357, 0.44870942], 
     [ 0.7031601 , 0.50889065, 0.30199446, 0.8022497 , 0.82347358], 
     [ 0.57058441, 0.38748261, 0.76947605, 0.48145936, 0.26650583]]) 
>>> b 
array([[ 1.16324907, 1.20751965, 1.15903343], 
     [ 1.67676172, 1.67871825, 1.01849056]]) 

모두 동일하고 둘은 다른 것보다 더 비싼 없습니다. 따라서 b을 만든 인덱스를 a에서 유지하는 한 변경된 데이터는 기본 배열에서 항상 볼 수 있습니다. 종종 슬라이스에서 작업을 수행 할 때 하위 배열을 만들 필요가 없습니다.

이 몇 가지 조건이 참 부분 배열의 인덱스를 반환 some_func 가정

편집.

함수가 인덱스를 반환 할 때 하위 배열의 함수 만 피드하려는 경우 하위 배열의 인덱스를 저장하고 기본 배열 인덱스를 가져올 필요가 있다고 생각합니다. 예를 들어 :

>>> def some_func(a): 
...  return np.where(a>.8) 
>>> a = np.random.random((10,4)) 
>>> a 
array([[ 0.94495378, 0.55532342, 0.70112911, 0.4385163 ], 
     [ 0.12006191, 0.93091941, 0.85617421, 0.50429453], 
     [ 0.46246102, 0.89810859, 0.31841396, 0.56627419], 
     [ 0.79524739, 0.20768512, 0.39718061, 0.51593312], 
     [ 0.08526902, 0.56109783, 0.00560285, 0.18993636], 
     [ 0.77943988, 0.96168229, 0.10491335, 0.39681643], 
     [ 0.15817781, 0.17227806, 0.17493879, 0.93961027], 
     [ 0.05003535, 0.61873245, 0.55165992, 0.85543841], 
     [ 0.93542227, 0.68104872, 0.84750821, 0.34979704], 
     [ 0.06888627, 0.97947905, 0.08523711, 0.06184216]]) 
>>> i_off, j_off = 3,2 
>>> b = a[i_off:,j_off:] #b 
>>> i = some_func(b) #indicies in b 
>>> i 
(array([3, 4, 5]), array([1, 1, 0])) 
>>> map(sum, zip(i,(i_off, j_off))) # indicies in a 
[array([6, 7, 8]), array([3, 3, 2])] 

편집 2

이 부분 배열 b의 수정 된 사본을 반환 some_func 가정합니다.

귀하의 예는 다음과 같이 보일 것입니다 :

import numpy as np 

def some_function(arr): 
    return arr*2.0 

a = np.arange(100)*2.        # size = 100 
idx = np.array(range(0,100,5)) 
b = some_function(a[idx]) # size = 20 
b_idx = np.argmax(b) 
a_idx = idx[b_idx] # indices in a translated from indices in b 

print b_idx, a_idx 
print b[b_idx], a[a_idx] 

assert b[b_idx] == 2* a[a_idx] #true! 
+0

예 그와 같은 색인을 어떻게 사용할 수 있는지 이해합니다. 하지만 내 특정 응용 프로그램에 대한, 그건 내가 필요로하지 않습니다. 아마도 내 예가 최선이 아니었을 것입니다. 이 코드는 함수로 들어가고 함수는 특정 조건이 충족되는 배열에 인덱스를 반환해야합니다. 따라서이 함수는'def some_function (arr)'과 같은 것일 수 있으며 일련의 조건을 만족하는 arr의 인덱스를 반환합니다. 배열의 값을 변경하려고하지 않습니다. –

+0

내 편집을 참조하십시오. 기본 배열에 하위 배열을 찾는 인덱스를 얻을 방법이 없습니다. 그게 좋을거야. 하위 배열을 만들고 반환 된 (하위 배열) 인덱스에 오프셋으로 적용하는 데 사용한 (기본 배열) 인덱스를 저장해야한다고 생각합니다. – Paul

+0

개선 된 샘플 코드를보고 또 다른 편집. – Paul

0

보조 배열 인 a_index를 사용합니다.이 배열은 a 요소의 인덱스이므로 a_index[3,5] = (3,5)입니다. 그런 다음 원본 색인을 a_index[condition == True][Index]으로 가져올 수 있습니다.

b가 a의 뷰인 것을 보장 할 수있는 경우 두 배열의 memory layout 정보를 사용하여 b와 a의 인덱스 간 변환을 찾을 수 있습니다.

관련 문제