Dapatkan gambar matriks dari nilai array numpy - Kisi dengan nilai piksel di dalamnya (bukan warna)

9

Saya mencari secara online dan tidak dapat menemukan apa pun tentang ini yang melakukan apa yang saya inginkan.

Saya ingin menyimpan array numpy sebagai gambar tetapi alih-alih memiliki gambar berwarna, saya ingin representasi hitam dan putih dari nilai-nilai piksel di lokasi grid yang sesuai.

Sebagai contoh:

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

Saya ingin menyimpan ini sebagai gambar (.PNG) yang terlihat seperti berikut:

output yang diharapkan

Kode saya saat ini membuat kisi-kisi dan menempatkan angka-angka di dalamnya, tetapi sangat sulit untuk menyesuaikan semuanya agar dapat ditampilkan dalam makalah penelitian.

Jadi daripada memposting kode saya yang terlalu rumit, saya bertanya-tanya apakah ada fungsi bawaan untuk menangani ini dalam beberapa baris kode.

Bragile
sumber
1
Sepertinya tableakan menjadi tempat yang baik untuk memulai. Saya belum cukup menggunakannya untuk memberikan jawaban yang baik.
Warren Weckesser
1
Lihat 'Tabel Demo' untuk contoh yang menggunakan table.
Warren Weckesser
4
Saya akan menggunakan LaTeX untuk tabel yang Anda coba tuliskan di kertas, sebagai lawan dari gambar raster.
alkasm
@alkasm masalahnya adalah matriks saya sebenarnya jauh lebih besar (14x14 atau 28x28) dan saya perlu membuat banyak gambar untuk mereka, jadi secara manual melakukannya di LaTex sepertinya metode yang sangat tidak efisien.
lbragile
5
Sebaliknya, rasterisasi ke gambar terdengar seperti metode yang tidak efisien. Tabel data bukan gambar, dan karenanya tidak boleh diperlakukan seperti itu. Anda dapat secara otomatis menghasilkan LaTeX, bahkan secara manual, dengan sangat mudah.
alkasm

Jawaban:

12

Saya akan menggunakan LaTeX untuk menghasilkan tabel, karena mereka terlihat mewah dan Anda dapat menghasilkan gambar atau langsung memasukkannya ke dalam dokumen Anda. Saya menggunakan kode berikut untuk mencapai ini:

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

Di sini, kelas dokumen previewdigunakan yang mengembalikan gambar yang diubah ukurannya ke konten dokumen, yaitu hanya tabel. Hanya tabularlingkungan yang digunakan untuk menyajikan data. Ada bar horisontal dan vertikal di antara sel, tetapi sangat mudah untuk mengubahnya. Dalam variabel tabdata diproses untuk setiap baris dan dikonversi menjadi string. Perhatikan bahwa Anda harus menentukan format output pada posisi ini. Saya mengaturnya %dagar semuanya dikonversi menjadi bilangan bulat.

Jika Anda ingin menggunakan tabel secara langsung dalam sumber lateks, Anda harus menghapus documentclassdan \begin{document}juga \end{document}dalam variabel dari startdan end. Akhirnya, semuanya disatukan dalam sumber lateks yang kemudian disimpan ke disk sebagai table.tex. Jika Anda hanya ingin gambar pada akhirnya, file yang dihasilkan dikompilasi ke table.pdf.

Berikut ini hasilnya. Tapi seperti yang saya katakan, sangat mudah untuk mengubah tampilannya karena itu adalah LaTeX :)

meja

Berikut adalah contoh lain dengan matriks besar (14 x 14), diisi dengan angka acak mulai dari 0 hingga 100:

Meja 2

Solvalou
sumber
8

Anda dapat menggunakan tablefungsi matplotuntuk memplot tabel sederhana. Selanjutnya, Anda dapat menyimpan plot sebagai PNG. Di bawah ini adalah kode sederhana untuk kebutuhan Anda:

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

Ukuran plot atau gambar dapat disesuaikan dengan mengubah figsizeparameter di baris:plt.figure(figsize=(x,y))

Untuk penampilan yang lebih baik, dapat dimodifikasi seperti di bawah ini:

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')
Ashwin Geet D'Sa
sumber
3
Saya hampir melakukan sesuatu sepertifig = plt.figure(figsize = x.shape)
Daniel F
4

Mungkin ini akan membantu:

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