2014-01-18 2 views
2

배열 집합을 가져 와서 본질적으로 항목 집합에 대한 표시 매트릭스가 될 행렬로 변환하려고합니다.파이썬에서 항목 집합을 벡터화하는 방법

는 I은 N 항목

A_ = [A,B,C,D,E,...,Y,Z] 

더하여의 배열을 가지고, I는 (현재 어레이에 저장) S 어레이 벡터 A의 아이템의 서브 세트를 가질

B_ = [A,B,C,Z] 
C_ = [A,B] 
D_ = [D,Y,Z] 
나는 변환하고자하는

X = [B_,C_,D_] 

: 그들은겠습니까에 저장됩니다

배열은 구조물과 같이이다 데이터를 쉽게 표시 할 수있는 지표 매트릭스로 변환합니다. 그것은 이상적으로 같을 것이다 (그것은 N의 X의 S 크기의 행렬 것) : 나는이 반복 매트릭스를 생성하는 루프를 사용할 수있는 방법을 알고

[1,1,1,0,...,0,1] 
[1,1,0,0,...,0,0] 
[0,0,0,1,...,1,1] 

그러나이 있는지 궁금했다 이것에 대해 더 효율적/구문 적으로 간단한 방법.

+3

[NumPy] (http://www.numpy.org)에 익숙합니까? – MattDMo

답변

1

간결한 방법은 당신이 떨어져을하면 마지막 줄은 당신이 함축에 익숙하지 않은 경우 비트 밀도가 있지만 너무 힘들하지 않는 list comprehension.

# Create a list containing the alphabet using a list comprehension 
A_ = [chr(i) for i in range(65,91)] 

# A list containing two sub-lists with some letters 
M = [["A","B","C","Z"],["A","B","G"]] 

# Nested list comprehension to convert character matrix 
# into matrix of indicator vectors 
I_M = [[1 if char in sublist else 0 for char in A_] for sublist in M] 

사용하는 것입니다. 내부 부분 ...

[1 if char in sublist else 0 for char in A_] 

또한 sublist에서 발견되는 A_의 모든 문자 (char) 1 개의 포함 된리스트를 생성 자체 지능형리스트,인가, 0의 sublist에서 찾을 수없는 문자.

외부 비트

...

[ ... for sublist in M] 

단순히 I_M에 저장된 내부리스트 통합에 의해 생성 된 모든 하위 목록 목록 결과 M 검색된 각 sublist위한 내부리스트 통합을 실행.

편집 :

나는 간단한 예제를 유지하기 위해 노력하는 동안, 그것은 주목할 가치가있다 testing membership in vanilla arrays is O(N) 그 (DSM 및 jterrace 포인트 아웃 등). Set과 같은 해시 구조로 변환하면 큰 하위 목록 검사 속도가 빨라집니다.

+0

이것은'O (N^2)'입니다. – jterrace

+2

''sublist else''에서''char (sublist char)'에''1을 압축 할 수 있습니다. 큰 목록보다 큰 집합의 구성원을 테스트하는 것이 빠르기 때문에'map (set, M)의 하위 집합에 대해 '를 사용하여 다소 큰 (S의 경우) 속도를 높일 수 있습니다. – DSM

+0

좋은 지적, 편집 됨. –

0

사용 NumPy와는 :

>>> import numpy as np 
>>> A_ = np.array(['A','B','C','D','E','Y','Z']) 
>>> B_ = np.array(['A','B','C','Z']) 
>>> C_ = np.array(['A','B']) 
>>> D_ = np.array(['D','Y','Z']) 
>>> X = [B_,C_,D_] 
>>> matrix = np.array([np.in1d(A_, x) for x in X]) 
>>> matrix.shape 
(3, 7) 
>>> matrix 
array([[ True, True, True, False, False, False, True], 
     [ True, True, False, False, False, False, False], 
     [False, False, False, True, False, True, True]], dtype=bool) 

O(NS)입니다.

관련 문제