รับภาพเมทริกซ์ของค่าอาร์เรย์แบบ numpy - ตารางที่มีค่าพิกเซลอยู่ภายใน (ไม่ใช่สี)


9

ฉันค้นหาออนไลน์และไม่พบสิ่งใดเกี่ยวกับสิ่งนี้ที่ฉันต้องการ

ฉันต้องการบันทึกอาร์เรย์แบบ numpy เป็นภาพ แต่แทนที่จะมีภาพที่มีสีสันฉันต้องการการแทนค่าพิกเซลแบบขาวดำในตำแหน่งกริดที่สอดคล้องกัน

ตัวอย่างเช่น:

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

ฉันต้องการบันทึกเป็นภาพ (.PNG) ที่มีลักษณะดังนี้:

ผลผลิตที่คาดหวัง

รหัสปัจจุบันของฉันสร้างกริดและวางตัวเลขไว้ข้างใน แต่มันยากมากที่จะปรับทุกอย่างเพื่อให้ปรากฏในรายงานการวิจัย

ดังนั้นแทนที่จะโพสต์รหัสที่ซับซ้อนมากเกินไปของฉันฉันสงสัยว่ามีฟังก์ชั่นบิวด์อินเพื่อจัดการกับโค้ดสองสามบรรทัดหรือไม่


1
ดูเหมือนว่าtableจะเป็นจุดเริ่มต้นที่ดี ฉันไม่ได้ใช้มันมากพอที่จะให้คำตอบที่ดี
Warren Weckesser

1
ดูโต๊ะสาธิต 'tableตัวอย่างที่ใช้
Warren Weckesser

4
ฉันจะใช้ LaTeX สำหรับตารางที่คุณพยายามใส่ลงไปในกระดาษแทนที่จะเป็นภาพแรสเตอร์
alkasm

@alkasm สิ่งที่เป็นเมทริกซ์ที่แท้จริงของฉันมีขนาดใหญ่กว่ามาก (14x14 หรือ 28x28) และฉันจำเป็นต้องทำภาพจำนวนมากสำหรับพวกเขาดังนั้นการทำด้วยตนเองใน LaTex ดูเหมือนว่าวิธีที่ไม่มีประสิทธิภาพมาก
lbragile

5
ในทางกลับกันการ rasterizing ให้กับภาพดูเหมือนวิธีที่ไม่มีประสิทธิภาพ ตารางข้อมูลไม่ใช่ภาพดังนั้นจึงไม่ควรปฏิบัติเช่นนี้ คุณสามารถสร้าง 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 x 14) เต็มไปด้วยตัวเลขสุ่มตั้งแต่ 0 ถึง 100:

table2


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')
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.