获取NumPy数组值的矩阵图像-具有像素值(不是颜色)内部的网格

9

我在网上搜索了一下,没能找到符合我的要求的内容。

我想把一个numpy数组保存为图片,但不想得到一个彩色图片,而是想得到一个黑白的图片,用像素值对应的网格位置表示。

比如:

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

我想将此内容保存为像以下这样的图像(.PNG):

expected output

我的当前代码创建了一个网格并将数字放在其中,但是很难调整所有内容使其在研究论文中呈现出色。

因此,我想知道是否有内置函数可以用几行代码处理此问题。请注意保留HTML标记。


1
看起来table是一个不错的起点。我还没有使用它足够多,无法给出一个好的答案。 - Warren Weckesser
1
请参考'Table Demo'示例,该示例使用了table - Warren Weckesser
4
相较于栅格图像,如果您要在论文中插入一张表格,我建议使用LaTeX。请注意,在翻译过程中保持原意,同时使语言通俗易懂。 - alkasm
@alkasm,问题是我的实际矩阵要大得多(14x14或28x28),我需要为它们制作许多图像,因此在LaTex中手动完成这个过程似乎是一种非常低效的方法。 - lbragile
5
相反,将数据光栅化为图像似乎是一种低效的方法。数据表格不是图像,因此不应该被视为图像处理。你可以非常容易地自动生成LaTeX甚至手动编写。 - alkasm
3个回答

13

我会使用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}},因此所有内容都将转换为整数。
如果要直接在latex源中使用该表格,则必须从{{start}}和{{end}}变量中删除{{documentclass}}、{{\begin{document}}}以及{{\end{document}}}。最后,将所有内容组合成一个latex源代码,然后将其存储到磁盘上,命名为{{table.tex}}。如果您只想得到最终的图像,则编译生成的文件为{{table.pdf}}。
以下是输出结果的样子。但正如我所说,非常容易更改外观,因为它是LaTeX :)

table

以下是另一个示例,使用一个14 x 14的大矩阵,其中填充了从0到100的随机数:

table2


8
您可以使用matplottable函数绘制简单表格。此外,您可以将绘制的图形保存为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')

通过在 plt.figure(figsize=(x,y)) 行中更改 figsize 参数,可以调整图形或图像的大小。

为了获得更好的外观效果,可以按以下方式进行修改:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接