获取numpy数组值的矩阵图像-内部像素值(非颜色)的网格


9

我在网上搜索,找不到任何符合我要求的内容。

我想将一个numpy数组另存为图像,但我不想使用彩色图像,而是希望以黑白表示像素值在其对应的网格位置中。

例如:

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

我想将其另存为如下所示的图像(.PNG):

预期产量

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

因此,我没有在发布我过于复杂的代码,而是想知道是否有内置函数可以在几行代码中处理该问题。


1
看起来table将是一个不错的起点。我还没有足够使用它来给出一个很好的答案。
沃伦·韦克瑟

1
有关使用的示例,请参见“表演示”table
沃伦·韦克瑟

4
我会将LaTeX用于您要放入纸张的表格,而不是栅格图像。
alkasm

@alkasm问题是我的实际矩阵要大得多(14x14或28x28),我需要为它们制作很多图像,因此在LaTex中手动执行此方法似乎效率很低。
易碎的

5
相反,光栅化图像听起来像效率低下的方法。数据表不是图像,因此不应这样对待。您甚至可以手动轻松地自动生成LaTeX。
alkasm

Answers:


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


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')
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.