Получить матричное изображение значений массивов - Сетка со значениями пикселей внутри (не цветами)

9

Я искал в Интернете и не мог найти ничего об этом, что делает то, что я хочу.

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

Например:

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

Я хотел бы сохранить это как изображение (.PNG), которое выглядит следующим образом:

ожидаемый результат

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

Поэтому вместо того, чтобы публиковать мой слишком сложный код, мне было интересно, есть ли встроенная функция для обработки этого в нескольких строках кода.

lbragile
источник
1
Похоже, tableбыло бы хорошим местом для начала. Я не использовал это достаточно, чтобы дать хороший ответ.
Уоррен Векессер
1
Смотрите «Table Demo» для примера, который использует table.
Уоррен Векессер
4
Я бы использовал LaTeX для таблицы, которую вы пытаетесь положить в бумагу, а не для растрового изображения.
Алказм
@alkasm дело в том, что мои настоящие матрицы намного больше (14x14 или 28x28), и мне нужно сделать много изображений для них, поэтому ручное выполнение этого в LaTex кажется очень неэффективным методом.
lbragile
5
Напротив, растеризация в изображения звучит как неэффективный метод. Таблицы данных не являются изображениями, и поэтому не должны рассматриваться как таковые. Вы можете автоматически генерировать LaTeX, даже вручную, очень легко.
Алказм

Ответы:

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 x 14), заполненной случайными числами в диапазоне от 0 до 100:

Таблица 2

Solvalou
источник
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)
Даниэль Ф
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')
Иван
источник