2014-04-09 11 views
5

Biorąc pod uwagę rzadką macierz binarną A (csr, coo, cokolwiek) Chcę zrobić wykres tak, że widzę pozycję (i, j) = biały na rysunku, jeśli A (ja, j) = 1 i (i, j) = czarny, jeśli A (i, j) = 0;python matplotlib plot rzadki wzorzec matrycy

Dla gęstej tablicy numpy, matshow wykona zadanie. Jednak wymiar mojej rzadkiej macierzy (na przykład 100000 x 1000000) jest duży, aby można go było przekształcić w gęstą macierz. Zastanawiam się, jak mógłbym narysować wzór w mojej rzadkiej macierzy.

Dzięki

Odpowiedz

18

można uzyskać ładny wynik stosując coo_matrix, plot() i pewne korekty:

import matplotlib.pyplot as plt 
from scipy.sparse import coo_matrix 

def plot_coo_matrix(m): 
    if not isinstance(m, coo_matrix): 
     m = coo_matrix(m) 
    fig = plt.figure() 
    ax = fig.add_subplot(111, axisbg='black') 
    ax.plot(m.col, m.row, 's', color='white', ms=1) 
    ax.set_xlim(0, m.shape[1]) 
    ax.set_ylim(0, m.shape[0]) 
    ax.set_aspect('equal') 
    for spine in ax.spines.values(): 
     spine.set_visible(False) 
    ax.invert_yaxis() 
    ax.set_aspect('equal') 
    ax.set_xticks([]) 
    ax.set_yticks([]) 
    return ax 

Zauważ, że oś y jest odwrócony, aby umieścić pierwszy wiersz w górnej części rysunku. Jeden przykład:

import numpy as np 
from scipy.sparse import coo_matrix 

shape = (100000, 100000) 
rows = np.int_(np.round_(shape[0]*np.random.random(1000))) 
cols = np.int_(np.round_(shape[1]*np.random.random(1000))) 
vals = np.ones_like(rows) 

m = coo_matrix((vals, (rows, cols)), shape=shape) 
ax = plot_coo_matrix(m) 
ax.figure.show() 

enter image description here

+2

Dziękuję. To naprawdę pomocne! Ucz się dużo ze swojego kodu :) – Jing