2017-02-13 5 views
1

히트 맵으로 플롯하려는 히스토그램이 포함 된 커다란 스파 스 매트릭스가 있습니다. 다음과 같이 일반적으로 단순히 전체 매트릭스 (h)을 그릴 것입니다 :스파 스 매트릭스의 플롯 히트 맵

import matplotlib.pyplot as plt 
plt.imshow(h.T, interpolation="nearest", origin="lower") 
plt.colorbar() 
plt.savefig("corr.eps") 

을이 경우 내가 그러나 전체 매트릭스 나 메모리에 유지하기 위해 너무 큰 189,940x189,940의 크기를했을 문제가 있습니다. 희소성 패턴 (예 : python matplotlib plot sparse matrix pattern)을 플로팅하는 것에 대한 게시물을 찾았지만 히트 맵을 플로팅하는 방법에 대해서는 아직 알지 못합니다. 그렇게 할 수 있습니까? (아니면 RAM을 다 써 버리지 않고 플로팅하는 다른 방법이 있습니까?) 내 스파 스 행렬은 현재 lilmatrix (scipy.sparse.lil_matrix)입니다.

+0

직접 시도하지 않았지만 '데이터 세이더'를 살펴 보았습니다. 유용 할 수도 있습니다. – reptilicus

+0

단순히 점을 개별적으로 분산 또는 사각형 컬렉션으로 플롯하는 것을 고려 했습니까? – ImportanceOfBeingErnest

+0

일반적으로 그렇게 하겠지만이 경우 각 셀에 셀 수가 포함되어 있으므로 셀이 채워져 있는지 여부는 신경 쓰지 않지만 셀에 어떤 값이 들어 있는지 신경 쓰지 않아도됩니다. 나는 어떻게 산란을 사용하여 그것을 시각화할지 모르겠습니다. 나는 '데이터 샤이더'를 아직 보지 않았지만 모양을 가질 것이다. –

답변

1

하나의 아이디어는 스파 스 동작을 사용하여 다운 샘플링하는 것입니다.

data = data.tocsc()  # sparse operations are more efficient on csc 
N, M = data.shape 
s, t = 400, 400   # decimation factors for y and x directions 
T = sparse.csc_matrix((np.ones((M,)), np.arange(M), np.r_[np.arange(0, M, t), M]), (M, (M-1) // t + 1)) 
S = sparse.csr_matrix((np.ones((N,)), np.arange(N), np.r_[np.arange(0, N, s), N]), ((N-1) // s + 1, N)) 
result = S @ data @ T  # downsample by binning into s x t rectangles 
result = result.todense() # ready for plotting 

이 코드 조각은 간단한 비닝을 구현하지만보다 정교한 필터를 통합 할 수 있습니다. binning 행렬은 binned id 행렬 일뿐입니다. 예를 들어, j // s = else if 0이면 S_ij = 1입니다.

일부 설명이 더 있습니다. 원래의 행렬은 매우 커서 출력을 시각적으로 눈에 띄는 차이없이 다운 샘플링 할 수 있습니다.

먼저 밀도가 높은 표현을 만들지 않고 다운 샘플링하는 방법에 대한 질문입니다. 가능한 한 대답은 행렬 곱셈의 관점에서 비닝을 ​​표현한 다음 희소 행렬 곱셈을 사용하는 것입니다. T의 열이 열 빈들에 대응 후 비닝 행렬 T 오른쪽에서 원래 데이터를 승산하는 경우

그래서, 특히 T의 열의 수는 다운 샘플링 된 데이터가 에있는 얼마나 많은 픽셀 결정할 x 방향. T의 각 열은 해당 빈에 들어가는 내용과 그렇지 않은 내용을 결정합니다. 이 예제에서는 인접한 열 (원래 행렬의)을 1로 인코딩하고 나머지는 0으로 설정하는 여러 요소를 설정합니다.이 열은이 열을 합계로 가져와 결과 행렬에 합계를 넣습니다. 즉,이 열을 함께 저장합니다. .

왼쪽에서 곱하면 똑같은 방식으로 작동하지만 행이 아니라 행에만 영향을줍니다.

비닝이 너무 미숙하다고 생각하면 간단한 0 계획을 부드러운 커널로 대체 할 수 있습니다. 결과 행렬이 희소성을 유지하는지 확인하십시오. 그러한 행렬을 설정하는 것은 약간의 노력이 필요하지만 어렵지 않습니다. 데이터에 희소 행렬을 사용하고 있으므로, 희소 행렬을 구성하는 방법에 익숙하다고 가정합니다.

+0

제안 해 주셔서 감사합니다. 여기 샘플링이 어떻게 작동하는지/샘플링 된 것을 어떻게 바꿀지 좀 더 설명해 주시겠습니까? 나는 아직 그것을 잘 따르지 않을 것을 두려워한다. –

+0

나는 노력했다. 업데이트 된 게시물을 살펴보십시오. –

+0

python2.7을 사용하고 있습니다. (미안하지만 내 게시물에는 보이지 않습니다.) 따라서'@ '연산자가 존재하지 않습니다. 이 게시물 (https://stackoverflow.com/questions/34142485/difference-between-numpy-dot-and-python-3-5-matrix-multiplication)에 따르면 이것은 'np.matmul'과 동일한 의미입니다. 'np.dot'. 그게 당신이 의도 한 것입니까? –