Obtenga una imagen matricial de valores de matriz numpy: cuadrícula con valores de píxeles dentro (no colores)

9

Busqué en línea y no pude encontrar nada sobre esto que haga lo que quiero.

Me gustaría guardar una matriz numpy como imagen, pero en lugar de tener una imagen colorida, quiero una representación en blanco y negro de los valores de píxeles en su ubicación de cuadrícula correspondiente.

Por ejemplo:

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

Me gustaría guardar esto como una imagen (.PNG) similar a la siguiente:

Rendimiento esperado

Mi código actual crea una cuadrícula y coloca los números dentro, pero es muy difícil ajustar todo para que sea presentable en un trabajo de investigación.

Entonces, en lugar de publicar mi código demasiado complejo, me preguntaba si hay una función integrada para manejar esto en unas pocas líneas de código.

lb frágil
fuente
1
Parece tableque sería un buen lugar para comenzar. No lo he usado lo suficiente como para dar una buena respuesta.
Warren Weckesser el
1
Consulte 'Demo de tabla' para ver un ejemplo que utiliza table.
Warren Weckesser
44
Usaría LaTeX para una tabla que está tratando de poner en un papel, en lugar de una imagen de trama.
alkasm el
@alkasm la cosa es que mis matrices reales son mucho más grandes (14x14 o 28x28) y necesito hacer muchas imágenes para ellas, por lo que hacerlo manualmente en LaTex parece un método muy ineficiente.
lbragile
55
Por el contrario, rasterizar las imágenes suena como el método ineficiente. Las tablas de datos no son imágenes, por lo que no deben tratarse como tales. Puede generar automáticamente LaTeX, incluso manualmente, de forma extremadamente fácil.
alkasmo el

Respuestas:

12

Usaría LaTeX para generar las tablas, ya que se ven elegantes y puedes generar una imagen o ponerlas directamente en tu documento. Usé el siguiente código para lograr esto:

#!/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")

Aquí, previewse usa la clase de documento que devuelve una imagen redimensionada al contenido del documento, es decir, solo la tabla. Solo tabularse utiliza un entorno para presentar los datos. Hay barras horizontales y verticales entre las celdas, pero es muy fácil cambiar esto. En la variable, tablos datos se procesan para cada fila y se convierten en una cadena. Tenga en cuenta que debe especificar el formato de salida en esta posición. Lo configuré para %dque todo se convierta en enteros.

Si desea utilizar la tabla directamente en una fuente de látex, debe eliminar documentclassy \begin{document}también \end{document}en las variables de starty end. Finalmente, todo se junta en una fuente de látex que luego se almacena en el disco como table.tex. Si solo desea la imagen al final, se compila el archivo resultante table.pdf.

Así es como se ve la salida. Pero como dije, es muy fácil cambiar el aspecto ya que es LaTeX :)

mesa

Aquí hay otro ejemplo con una matriz grande (14 x 14), llena de números aleatorios que van del 0 al 100:

Tabla 2

Solvalou
fuente
8

Puede usar la tablefunción de matplotpara trazar la tabla simple. Además, puede guardar la trama como PNG. A continuación se muestra el código simple para sus requisitos:

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')

El tamaño del gráfico o la imagen se puede ajustar cambiando los figsizeparámetros en la línea:plt.figure(figsize=(x,y))

Para una mejor apariencia, se puede modificar de la siguiente manera:

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')
Ashwin Geet D'Sa
fuente
3
Casi haría algo comofig = plt.figure(figsize = x.shape)
Daniel F
4

Tal vez esto ayude:

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')
Ivan
fuente