Ottieni un'immagine matrice di valori di matrice numpy - Griglia con valori di pixel all'interno (non colori)


9

Ho cercato online e non sono riuscito a trovare nulla che faccia quello che voglio.

Vorrei salvare un array intorpidito come immagine ma invece di avere un'immagine colorata, voglio una rappresentazione in bianco e nero dei valori dei pixel nella posizione della griglia corrispondente.

Per esempio:

import numpy as np
x = np.array([[1,2],[3,4]])
print(x)
# [[1 2]
#  [3 4]]

Vorrei salvarlo come immagine (.PNG) simile al seguente:

uscita prevista

Il mio codice attuale crea una griglia e inserisce i numeri all'interno, ma è molto difficile regolare tutto per renderlo presentabile in un documento di ricerca.

Quindi, piuttosto che pubblicare il mio codice troppo complesso, mi chiedevo se esiste una funzione integrata per gestirlo in poche righe di codice.


1
Sembra che tablesarebbe un buon punto di partenza. Non l'ho usato abbastanza per dare una buona risposta.
Warren Weckesser,

1
Vedi 'Tabella Demo' per un esempio che utilizza table.
Warren Weckesser,

4
Vorrei usare LaTeX per un tavolo che stai cercando di mettere su un foglio, al contrario di un'immagine raster.
alkasm

@alkasm il fatto è che le mie matrici attuali sono molto più grandi (14x14 o 28x28) e ho bisogno di fare molte immagini per loro, quindi farlo manualmente in LaTex sembra un metodo molto inefficiente.
lbragile,

5
Al contrario, la rasterizzazione delle immagini sembra il metodo inefficiente. Le tabelle di dati non sono immagini e pertanto non devono essere trattate come tali. Puoi generare automaticamente LaTeX, anche manualmente, in modo estremamente semplice.
alkasm

Risposte:


12

Vorrei usare LaTeX per generare le tabelle, poiché sembrano fantasiose e puoi generare un'immagine o inserirle direttamente nel tuo documento. Ho usato il seguente codice per raggiungere questo obiettivo:

#!/usr/bin/env
import numpy as np
import os

x = np.array([[1,2],[3,4]])

def generateLatexTable(x):
    start = [r'\documentclass[preview]{standalone}', r'\begin{document}', r'\begin{tabular}{%s}' % ('{1}{0}{1}'.format('|'.join(['r'] * x.shape[1]), '|')), r'\hline']
    tab = [' & '.join(['%d' % val for val in row]) + r' \\ \hline' for row in x]
    end = [r'\end{tabular}', r'\end{document}']
    text = '\n'.join(start + tab + end)

    return text

with open('table.tex', 'w') as f:
    f.write(generateLatexTable(x))
os.system("pdflatex table.tex")

Qui previewviene utilizzata la classe del documento che restituisce un'immagine ridimensionata al contenuto del documento, ovvero solo la tabella. Solo un tabularambiente viene utilizzato per presentare i dati. Ci sono barre orizzontali e verticali tra le celle, ma è molto facile cambiarlo. Nella variabile tabi dati vengono elaborati per ogni riga e convertiti in una stringa. Si noti che è necessario specificare il formato di output in questa posizione. L'ho impostato su %dcosì tutto viene convertito in numeri interi.

Se si desidera utilizzare la tabella direttamente in una fonte in lattice, è necessario rimuovere documentclasse \begin{document}nonché \end{document}le variabili di starte end. Infine, tutto viene messo insieme in una sorgente in lattice che viene quindi archiviata su disco come table.tex. Se vuoi solo l'immagine alla fine, il file risultante viene compilato in table.pdf.

Ecco come appare l'output. Ma come ho detto, è molto facile cambiare l'aspetto dato che è LaTeX :)

tavolo

Ecco un altro esempio con una matrice grande (14 x 14), piena di numeri casuali che vanno da 0 a 100:

Tavolo 2


8

È possibile utilizzare la tablefunzione di matplotper tracciare la tabella semplice. Inoltre, è possibile salvare la trama come PNG. Di seguito è riportato il semplice codice per le tue esigenze:

import numpy as np
import matplotlib.pyplot as plt

x = np.array([[1,2],[3,4]])

plt.figure()
plt.table(cellText=x,cellLoc='center',loc='center')
plt.axis('off')
plt.savefig('table.png')

Le dimensioni del diagramma o dell'immagine possono essere regolate modificando i figsizeparametri nella linea:plt.figure(figsize=(x,y))

Per un aspetto migliore, può essere modificato come di seguito:

import numpy as np
import matplotlib.pyplot as plt

x = np.array([[1,2],[3,4]])

fig = plt.figure(figsize=(2,2))
plt.axis('off')
plt.axis('tight')
plt.table(cellText=x,cellLoc='center',loc='center')
#plt.subplots_adjust(hspace=0.5)
fig.tight_layout()
plt.savefig('table.png')

3
Farei quasi qualcosa del generefig = plt.figure(figsize = x.shape)
Daniel F,

4

Potrebbe essere questo aiuterà:

from matplotlib import pyplot as plt
import numpy as np

w  = 10
h  = 10 
img = np.random.randint(255, size=(w, h))
plt.figure(figsize=(5,8))
plt.imshow(img, interpolation='nearest')
plt.axis('off')

cellTextimg =  []
for j in range(0,h):
    cellTextimg.append(img[j,:])

the_table = plt.table(cellText= cellTextimg, loc='bottom')
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.