Отримати матричне зображення числових значень масиву - Сітка зі значеннями пікселів всередині (не кольорами)


9

Я шукав в Інтернеті і не міг знайти нічого з цього приводу, що робить те, що я хочу.

Я хотів би зберегти нумерований масив як зображення, але замість того, щоб мати барвисте зображення, я хочу чорно-біле зображення значень пікселів у відповідному розташуванні сітки.

Наприклад:

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

Я хотів би зберегти це як зображення (.PNG), яке виглядає наступним чином:

очікуваний вихід

Мій поточний код створює сітку і розміщує номери всередині, але дуже важко відрегулювати все, щоб зробити його презентабельним у дослідницькій роботі.

Тому замість того, щоб публікувати мій надто складний код, мені було цікаво, чи є вбудована функція, яка може впоратися з цим у кількох рядках коду.


1
Схоже, це tableбуло б гарне місце для початку. Я не використав її достатньо, щоб дати хорошу відповідь.
Warren Weckesser

1
Див. "Демо-таблицю" для прикладу, який використовує table.
Воррен Вексерсер

4
Я використовував би LaTeX для таблиці, яку ви намагаєтеся помістити в папір, на відміну від растрового зображення.
alkasm

@alkasm справа в тому, що мої фактичні матриці набагато більші (14x14 або 28x28), і мені потрібно зробити для них багато зображень, тому вручну це робити в LaTex здається дуже неефективним методом.
lbragile

5
Навпаки, растрування на зображення звучить як неефективний метод. Таблиці даних не є зображеннями, тому їх не слід розглядати як такі. Ви можете автоматично генерувати LaTeX, навіть вручну, надзвичайно легко.
alkasm

Відповіді:


12

Я б використовував LaTeX для створення таблиць, оскільки вони виглядають фантастично, і ви можете або генерувати зображення, або безпосередньо помістити їх у свій документ. Для цього я використав такий код:

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

Тут використовується клас документа preview, який повертає змінене зображення до змісту документа, тобто просто таблиці. tabularДля представлення даних використовується лише середовище. Між осередками є горизонтальні та вертикальні смуги, але змінити це дуже просто. У змінній tabдані обробляються для кожного рядка і перетворюються в рядок. Зверніть увагу, що вам потрібно вказати вихідний формат у цій позиції. Я встановив це %dтак, щоб все перетворилося на цілі числа.

Якщо ви хочете використовувати таблицю безпосередньо в джерелі латексу, ви повинні видалити documentclassі \begin{document}так само , як \end{document}в змінних startі end. Нарешті, все збирається в латекс-джерело, яке потім зберігається на диску як table.tex. Якщо ви просто хочете, щоб зображення було врешті-решт, отриманий файл збирається в table.pdf.

Ось як виглядає вихід. Але, як я вже сказав, змінити зовнішній вигляд дуже просто, оскільки це LaTeX :)

стіл

Ось ще один приклад з великою матрицею (14 х 14), заповненою випадковими числами від 0 до 100:

таблиця2


8

Ви можете використовувати tableфункцію matplotдля побудови простої таблиці. Крім того, ви можете зберегти сюжет як PNG. Нижче наведено простий код для ваших вимог:

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

Розмір сюжету чи зображення можна регулювати, змінюючи figsizeпараметри в рядку:plt.figure(figsize=(x,y))

Для кращого вигляду його можна змінити, як показано нижче:

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
Я майже зробив щось на кшталтfig = plt.figure(figsize = x.shape)
Daniel F

4

Можливо, це допоможе:

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')
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.