1

길이가 n 인 열 벡터 y가 있고 크기가 n * m 인 행렬 X가 있다고 가정합니다. 요소가 X의 해당 행에 있는지 여부를 확인하고 싶습니다. 가장 효율적인 방법은 무엇입니까? 예를 들어Numpy 작동 방식의 요소

:

y = [1,2,3,4].T

X =[[1, 2, 3],[3, 4, 5],[4, 3, 2],[2, 2, 2]] 

나서 출력 적 쉽다

[1, 0, 1, 0] or [True, False, True, False] 

이어야한다.

물론 for 루프를 사용하여 y와 X를 모두 반복 할 수 있지만 더 효율적인 방법이 있습니까?

+0

있습니까 ])'? – Eric

답변

1
사용

벡터화 접근 broadcasting -

((X == y[:,None]).any(1)).astype(int) 

샘플 실행 - 당신은 출력이`np.array ([참, 거짓, 참, 거짓되고 싶지 않아 확인

In [41]: X  # Input 1 
Out[41]: 
array([[1, 2, 3], 
     [3, 4, 5], 
     [4, 3, 2], 
     [2, 2, 2]]) 

In [42]: y  # Input 2 
Out[42]: array([1, 2, 3, 4]) 

In [43]: X == y[:,None] # Broadcasted comparison 
Out[43]: 
array([[ True, False, False], 
     [False, False, False], 
     [False, True, False], 
     [False, False, False]], dtype=bool) 

In [44]: (X == y[:,None]).any(1) # Check for any match along each row 
Out[44]: array([ True, False, True, False], dtype=bool) 

In [45]: ((X == y[:,None]).any(1)).astype(int) # Convert to 1s and 0s 
Out[45]: array([1, 0, 1, 0]) 
+1

필자는 명확성을 위해'any (1)'은'.any (axis = 1)'철자를 사용해야한다고 주장한다. – Eric