Uzyskaj obraz matrycowy wartości tablic numpy - Siatka z wartościami pikseli w środku (bez kolorów)

9

Szukałem online i nie mogłem znaleźć nic na ten temat, co robi to, co chcę.

Chciałbym zapisać tablicę numpy jako obraz, ale zamiast mieć kolorowy obraz, chcę czarno-białą reprezentację wartości pikseli w odpowiadającej im lokalizacji siatki.

Na przykład:

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

Chciałbym zapisać to jako obraz (.PNG), który wygląda następująco:

oczekiwany wynik

Mój obecny kod tworzy siatkę i umieszcza liczby w środku, ale bardzo trudno jest dostosować wszystko, aby było prezentowalne w pracy badawczej.

Zamiast więc publikować mój zbyt skomplikowany kod, zastanawiałem się, czy istnieje wbudowana funkcja do obsługi tego w kilku wierszach kodu.

lbragile
źródło
1
Wygląda na to, tableże byłby to dobry początek. Nie wykorzystałem go wystarczająco, aby dać dobrą odpowiedź.
Warren Weckesser
1
Zobacz „Table Demo”, aby zobaczyć przykład, który używa table.
Warren Weckesser
4
Używałbym LaTeXa do stołu, który próbujesz umieścić na papierze, w przeciwieństwie do obrazu rastrowego.
alkasm
@ alkasm chodzi o to, że moje rzeczywiste macierze są znacznie większe (14 x 14 lub 28 x 28) i muszę zrobić dla nich wiele obrazów, więc ręczne wykonanie tego w LaTexie wydaje się bardzo nieefektywną metodą.
lbragile,
5
Przeciwnie, rasteryzacja do obrazów brzmi jak nieefektywna metoda. Tabele danych nie są obrazami i dlatego nie powinny być traktowane jako takie. Możesz automatycznie generować LaTeX, nawet ręcznie, niezwykle łatwo.
alkasm

Odpowiedzi:

12

Użyłbym LaTeXa do wygenerowania tabel, ponieważ wyglądają fantazyjnie i możesz albo wygenerować obraz, albo bezpośrednio umieścić je w swoim dokumencie. Aby to osiągnąć, użyłem następującego kodu:

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

W tym przypadku previewużywana jest klasa dokumentu, która zwraca obraz o zmienionym rozmiarze do zawartości dokumentu, tj. Tylko tabeli. Do tabularprezentacji danych używane jest tylko środowisko. Pomiędzy komórkami znajdują się poziome i pionowe paski, ale bardzo łatwo to zmienić. W zmiennej tabdane są przetwarzane dla każdego wiersza i konwertowane na ciąg. Pamiętaj, że musisz określić format wyjściowy w tej pozycji. Ustawiłem na %dtak, aby wszystko było konwertowane na liczby całkowite.

Jeśli chcesz używać tabeli bezpośrednio w źródle lateksu, musisz usunąć, documentclassa \begin{document}także \end{document}w zmiennych starti end. Na koniec wszystko składa się w źródło lateksu, które jest następnie przechowywane na dysku jako table.tex. Jeśli chcesz tylko obraz na końcu, plik wynikowy zostanie skompilowany table.pdf.

Oto jak wygląda wyjście. Ale tak jak powiedziałem, bardzo łatwo jest zmienić wygląd, ponieważ jest to LaTeX :)

stół

Oto kolejny przykład z dużą matrycą (14 x 14), wypełnioną losowymi liczbami od 0 do 100:

Tabela 2

Solvalou
źródło
8

Możesz użyć tablefunkcji matplotdo wykreślenia prostej tabeli. Ponadto możesz zapisać wykres jako PNG. Poniżej znajduje się prosty kod dla twoich wymagań:

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

Rozmiar działki lub obrazu można dostosować, zmieniając figsize parametry w wierszu:plt.figure(figsize=(x,y))

Dla lepszego wyglądu można go zmodyfikować jak poniżej:

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
źródło
3
Prawie zrobiłbym coś takiegofig = plt.figure(figsize = x.shape)
Daniel F
4

Może to pomoże:

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
źródło