2013-07-22 6 views
3

다음은 문제를 설명하기위한 작은 코드입니다.numpy 배열의 값 배열 위치

A = array([[1,2], [1,0], [5,3]]) 
f_of_A = f(A) # this is precomputed and expensive 


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


# location of values in A 
# if I just had 1d values I could use numpy.in1d here 
indices = array([0, 1]) 


# example of operation type I need (recalculating f_of_A as needed is not an option) 
f_of_A[ indices ] 

그래서 기본적으로 더 높은 차원의 경우에는 in1d와 동등한 항목이 필요하다고 생각합니다. 그런 것이 있습니까? 아니면 다른 접근법이 있습니까?

searchsorted() 함수가있는 것처럼 보이지만 1d 배열에서도 작동하는 것으로 보입니다. 이 예에서는 2 차원 점을 사용했지만 모든 솔루션은 3 차원 점에서도 사용해야합니다.

답변

2

오케이, 이것이 내가 생각해 낸 것입니다.

n.where((A == ii).all(axis=1))[0] 

이의이을 분해하자, 우리는 각 ii 요소와 현명한 비교를 줄 것이다, A == ii 있습니다

는 우리가 할 수있는,의는 ii = np.array([1,2]) 말을하자, 하나의 다차원 인덱스의 값을 찾으려면 행은 A입니다. 전체 행이 true가되도록하려면 .all(axis=1)을 추가하여 접습니다. 이 색인이 어디에서 발생하는지 찾기 위해 np.where에 연결하고 튜플의 첫 번째 값을 가져옵니다.

이제 여러 인덱스를 사용하여이 작업을 빠르게 수행 할 수있는 방법이 없습니다 (단 하나의 느낌이 들지만). 그러나이 작업이 완료 얻을 것이다 :

np.hstack([np.where((A == values[i]).all(axis=1))[0] for i in xrange(len(values))]) 

이것은 기본적으로 그냥 values의 각 값에 대해, 위의 호출하고 결과를 연결합니다.

업데이트 : 여기

는 다차원 경우에 (한 번에 모두 상당히 빨리해야)한다 :

np.where((np.expand_dims(A, -1) == values.T).all(axis=1).any(axis=1))[0] 
+0

가 어떻게'axis'의 작품을 설명 할 수 있습니까? 나는'np.all'에 대해 읽었고'axis'가 의미하는 것을 이해하지 못했습니다 –

1

당신은 원래 배열의 뷰를 통해 np.in1d을 사용할 수 있습니다 모든 좌표가 dtype의 단일 변수로 축소되었습니다. np.void :

import numpy as np 

A = np.array([[1,2], [1,0], [5,3]]) 
values = np.array([[1,2], [1,0]]) 

# Make sure both arrays are contiguous and have common dtype 
common_dtype = np.common_type(A, values) 
a = np.ascontiguousarray(A, dtype=common_dtype) 
vals = np.ascontiguousarray(values, dtype=common_dtype) 

a_view = A.view((np.void, A.dtype.itemsize*A.shape[1])).ravel() 
values_view = values.view((np.void, 
          values.dtype.itemsize*values.shape[1])).ravel() 

이제 각각 a_viewvalues_view은 함께 모인 1 점에 대한 좌표이므로 모든 1D 마법을 사용할 수 있습니다. 하지만 인덱스를 찾을 np.in1d를 사용하는 방법을 나는 보지 않는다, 그래서 np.searchsorted 경로 갈 것 :

sort_idx = np.argsort(a_view) 
locations = np.searchsorted(a_view, values_view, sorter=sort_idx) 
locations = sort_idx[locations] 

>>> locations 
array([0, 1], dtype=int64) 
+0

고마워요, 1d보기를 사용하려고했지만 제 문제가 np.ascontiguousarray()를 사용하지 않았다고 생각합니다. np.in1d에 관해서는 이것은 인덱스 대신에 마스크를 생성하는 것입니다. – user1984528