2016-10-20 3 views
2

일부 요소 계산을 벡터화하려고하지만 전역 정보에 대한 로컬 정보에 대한 목록 보급을 만들지 않으면 어려움이 있습니다. 논리 배열을 사용하여 수행하고 싶은 작업을 수행 할 수 있다고 들었지만 지금까지 발견 한 예제는 도움이되지 않았습니다. 네, 목록 내포를 통해이를 수행 할 수 있지만 스피드는 제 코드의 주요 관심사입니다.논리적 배열과 파이썬에서 매핑

"글로벌"계산에서 조정해서는 안되는 인덱스를 나타내는 값 집합이 있습니다.

예를 들어, 이러한 "고정"지수 내 글로벌 계산 열 개 요소를 가지고 있다면, 글로벌 세트의 목록을 작성하여 모든 "무료"값을 설정할 수있을 것

1 2 6 

있습니다 고정 지수를 뺀 값.

global = [10, 1, 1, 10, 10, 10, 1, 10, 10, 10] 

내 "생산해야 다음 코드

global = np.ones(10) 
global[free] = global[free] * 10 

같이 글로벌 계산

free = list(set(range(len(global)) - set(fixed)) 
[0, 3, 4, 5, 7, 8, 9] 

, 나는"자유 "요소를 조정할 수있을 것 지역 "계산은 전역 계산의 부분 집합이며, 지역지도는 전역 계산에서 해당 색인을 나타냅니다.

local_map = [4, 2, 1, 8, 6] 
local_values = [40, 40, 40, 40, 40] 

하지만 계산을 위해 순서를 유지하려면 로컬 맵과 관련된 값이 필요합니다.

글로벌 [무료]에 상응하는 것은 로컬 수준에 무엇이 있습니까? 원하는 출력이 같은 것입니다 :

나는 질문의 형식이 꺼져있는 경우 사과
local_free = list(set(range(len(local)) - set(fixed)) 
local_values[local_free] *= 10 
OUTPUT: local_values = [400, 40, 40, 400, 40] 

, 코드 블록 서식 내 브라우저에서 작동하지 않는 것, 그래서 당신은 설명이 필요한 경우 알려 주시기 바랍니다 .

답변

0

이러한 비교 관련 작업의 경우 NumPy는 np.setdiff1dnp.in1d과 같은 도구를 사용합니다. 우리의 경우를 해결하기 위해이 두 가지면 충분합니다. NumPy가 지원하는 벡터화 된 인덱싱 방법을 사용할 수 있으므로 NumPy 배열로 가정합니다.첫 번째 경우에

, 우리는이 -

In [97]: fixed = np.array([1,2,6]) 
    ...: global_arr = np.array([10, 1, 1, 10, 10, 10, 1, 10, 10, 10]) 
    ...: 

이 NumPy와의 list(set(range(len(global_arr)) - set(fixed))의 동등한를 얻으려면, 우리는 np.setdiff1d의 사용을 만들 수 - 최대

In [98]: np.setdiff1d(np.arange(len(global_arr)),fixed) 
Out[98]: array([0, 3, 4, 5, 7, 8, 9]) 

다음, 우리가 -

In [99]: local_map = np.array([4, 2, 1, 8, 6]) 
    ...: local_values = np.array([42, 40, 48, 41, 43]) 
    ...: 

우리는 -

In [100]: local_free = ~np.in1d(local_map,fixed) 
    ...: local_values[local_free] *= 10 
    ...: 

In [101]: local_values 
Out[101]: array([420, 40, 48, 410, 43]) 
- 여기
local_free = list(set(range(len(local)) - set(fixed)) 
local_values[local_free] *= 10 

, 우리는 색인을 사용 NumPy와의 boolean-indexing 방법 local_values로 지정 될 수있는 local_free에 대한 동등한로 마스크를 얻을 수 np.in1d을 사용할 수 있습니다