Matrixbild von Numpy-Array-Werten abrufen - Raster mit Pixelwerten im Inneren (keine Farben)

9

Ich habe online gesucht und konnte nichts finden, was das tut, was ich will.

Ich möchte ein numpy-Array als Bild speichern, aber anstatt ein farbenfrohes Bild zu haben, möchte ich eine Schwarzweißdarstellung der Pixelwerte an der entsprechenden Rasterposition.

Zum Beispiel:

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

Ich möchte dies als Bild (.PNG) speichern, das wie folgt aussieht:

erwartete Ausgabe

Mein aktueller Code erstellt ein Raster und platziert die Zahlen darin, aber es ist sehr schwierig, alles anzupassen, um es in einem Forschungsbericht präsentierbar zu machen.

Anstatt meinen übermäßig komplexen Code zu veröffentlichen, habe ich mich gefragt, ob es eine integrierte Funktion gibt, die dies in wenigen Codezeilen behandelt.

lbragile
quelle
1
Sieht so aus, als tablewäre es ein guter Anfang. Ich habe es nicht genug benutzt, um eine gute Antwort zu geben.
Warren Weckesser
1
Ein Beispiel für die Verwendung finden Sie unter 'Tabellendemo'table .
Warren Weckesser
4
Ich würde LaTeX für eine Tabelle verwenden, die Sie in ein Papier einfügen möchten, im Gegensatz zu einem Rasterbild.
Alkasm
@alkasm Die Sache ist, dass meine tatsächlichen Matrizen viel größer sind (14x14 oder 28x28) und ich viele Bilder für sie erstellen muss. Daher scheint es eine sehr ineffiziente Methode zu sein, dies manuell in LaTex zu tun.
lbragile
5
Im Gegenteil, das Rastern von Bildern klingt nach einer ineffizienten Methode. Datentabellen sind keine Bilder und sollten daher nicht als solche behandelt werden. Sie können LaTeX auch manuell sehr einfach automatisch generieren.
Alkasm

Antworten:

12

Ich würde LaTeX verwenden, um die Tabellen zu generieren, da sie schick aussehen und Sie entweder ein Bild generieren oder sie direkt in Ihr Dokument einfügen können. Ich habe den folgenden Code verwendet, um dies zu erreichen:

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

Hier wird die Dokumentklasse previewverwendet, die ein Bild zurückgibt, dessen Größe an den Inhalt des Dokuments angepasst ist, dh nur an die Tabelle. Zur tabularDarstellung der Daten wird nur eine Umgebung verwendet. Es gibt horizontale und vertikale Balken zwischen den Zellen, aber es ist sehr einfach, dies zu ändern. In der Variablen werden tabdie Daten für jede Zeile verarbeitet und in eine Zeichenfolge konvertiert. Beachten Sie, dass Sie das Ausgabeformat an dieser Position angeben müssen. Ich habe es %dso eingestellt, dass alles in ganze Zahlen umgewandelt wird.

Wenn Sie die Tabelle direkt in einer Latexquelle verwenden möchten, müssen Sie documentclassund \begin{document}sowie \end{document}die Variablen von startund entfernen end. Schließlich wird alles in einer Latexquelle zusammengefasst, die dann als auf der Festplatte gespeichert wird table.tex. Wenn Sie nur das Bild am Ende haben möchten, wird die resultierende Datei zu kompiliert table.pdf.

So sieht die Ausgabe aus. Aber wie gesagt, es ist sehr einfach, das Aussehen zu ändern, da es LaTeX ist :)

Tabelle

Hier ist ein weiteres Beispiel mit einer großen Matrix (14 x 14), die mit Zufallszahlen zwischen 0 und 100 gefüllt ist:

Tabelle 2

Solvalou
quelle
8

Sie können die tableFunktion von verwenden matplot, um die einfache Tabelle zu zeichnen. Außerdem können Sie den Plot als PNG speichern. Unten finden Sie den einfachen Code für Ihre Anforderungen:

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

Die Größe des Diagramms oder Bildes kann durch Ändern der figsizeParameter in der Zeile angepasst werden :plt.figure(figsize=(x,y))

Für ein besseres Erscheinungsbild kann es wie folgt geändert werden:

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
quelle
3
Ich würde fast so etwas tunfig = plt.figure(figsize = x.shape)
Daniel F
4

Vielleicht hilft das:

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
quelle