2016-06-18 2 views
2

행렬의 결과 (회전 등으로 인해)가 많지만 한 번만 저장해야합니다. 나는 세트 사용에 대한 생각 : 불행하게도행렬 집합

print set([np.matrix([[0, 0],[0, 1],[1, 1],[2, 1]]), 
np.matrix([[0, 0],[1, 0],[1, -1],[1, -2]])]) 

를, 내가 얻을 :

TypeError: unhashable type: 'matrix'

세트가 정확하게 올바른 데이터 유형이 될 것입니다 반복을 피하기 위해 노동 조합을 사용할 수 있기 때문에 그것은 슬픈 , 교차점 등

파이썬에서 행렬 세트를 사용하는 방법은 무엇입니까?

+1

도움이 될 수 있습니다. http://stackoverflow.com/questions/1939228/constructing-a-python-set-from-a-numpy-matrix –

+0

파이썬 버전이란 무엇입니까? 그리고 Numpy? – Kasramvd

+0

@Kasravand : 2.7 – Basj

답변

0
In [299]: m1 
Out[299]: 
matrix([[0, 0], 
     [0, 1], 
     [1, 1], 
     [2, 1]]) 

In [300]: m2 
Out[300]: 
matrix([[ 0, 0], 
     [ 1, 0], 
     [ 1, -1], 
     [ 1, -2]]) 

In [297]: set([tuple(m1.A1),tuple(m2.A1)]) 
Out[297]: {(0, 0, 0, 1, 1, 1, 2, 1), (0, 0, 1, 0, 1, -1, 1, -2)} 

m1.A1 간단한 목록으로 표시하는 1 차원 배열로 매트릭스 변환한다. tuple에 랩핑하면 해시 가능 객체가됩니다.

set은 키가 있지만 값이없는 사전과 같습니다. 둘 다 각 키를 '해시'로 변환하여 빠른 액세스 (및 in 테스트)를 제공합니다. 튜플이 필요한 이유 중 일부는 목록과 달리 불변이어야한다는 것입니다. 행렬의 값 중 하나를 변경하면 해시가 변경됩니다.

A1 (또는 다른 등급)이 없으면 작동하지 않습니다. tuple(m1)을보십시오.

In [302]: set([tuple(m1),tuple(m2)]) 
... 
TypeError: unhashable type: 'matrix' 

In [303]: tuple(m1) 
Out[303]: (matrix([[0, 0]]), matrix([[0, 1]]), matrix([[1, 1]]), matrix([[2, 1]])) 

매트릭스를 일부 문자열 표현으로 변환하여 저장할 수도 있습니다. 이러한 전환으로 공간이 절약되는 것은 아니며 모든 전환 비용이 발생합니다.

이러한 행렬을 비교하는 방법을 알아볼 필요가 있습니다. 무엇이 다른 것과 다른 것입니까? 일치하는 요소의

평등 : 그들은 모두 같은 모양 있어야합니다 물론

In [306]: m1==m2 
Out[306]: 
matrix([[ True, True], 
     [False, False], 
     [ True, False], 
     [False, False]], dtype=bool) 

In [307]: (m1==m2).all() 
Out[307]: False 

In [308]: (m1==m1).all() 
Out[308]: True 

.

모양이 다른 경우 요소 별 비교를 수행 할 수 없으므로 부울 스칼라를 반환합니다.

In [309]: m1==m1.T 
Out[309]: False 

(m2[:] 다른 개체를 같은 값을 가지고 있지만입니다) 당신은 객체 식별자

In [314]: set([id(m1),id(m2),id(m2[:])]) 
Out[314]: {3029619684, 3036025828, 3036825892} 

를 비교할 수 있지만, 뷰의 평등을 캡처하지 않습니다.

또한 값을 변경하면 (예 : m2[2,1]=1이면 id은 변경되지 않지만 tuple(m2.A1) 해시 및 동등성 테스트는 변경됩니다.