Numpy dizi değerlerinin matris görüntüsünü alma - İçinde piksel değerleri olan ızgara (renkler değil)


9

Çevrimiçi arama yaptım ve bununla ilgili istediğim şeyi yapan bir şey bulamadım.

Numpy dizi görüntü olarak kaydetmek istiyorum ama renkli bir görüntü yerine, karşılık gelen ızgara konum piksel değerlerinin siyah beyaz bir temsilini istiyorum.

Örneğin:

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

Bunu aşağıdaki gibi görünen bir görüntü (.PNG) olarak kaydetmek istiyorum:

beklenen çıktı

Mevcut kodum bir ızgara oluşturur ve sayıları içine yerleştirir, ancak her şeyi bir araştırma makalesinde sunulabilmesi için ayarlamak çok zordur.

Çok karmaşık kodumu göndermek yerine, birkaç kod satırında bu işlemek için yerleşik bir fonksiyon olup olmadığını merak ediyordum.


1
Görünüşe göre tablebaşlamak için iyi bir yer olurdu. İyi bir cevap vermek için yeterince kullanmadım.
Warren Weckesser

1
Kullanan bir örnek için bkz. 'Tablo Demosu'table .
Warren Weckesser

4
Raster görüntünün aksine, bir kağıda koymaya çalıştığınız bir tablo için LaTeX'i kullanırdım.
alkazm

@alkasm şey benim gerçek matrisler çok daha büyük (14x14 veya 28x28) ve onlar için birçok görüntü yapmak gerekir, bu yüzden LaTex bunu elle yapmak çok verimsiz bir yöntem gibi görünüyor.
lbragile

5
Aksine, görüntülere rasterleştirmek verimsiz yöntem gibi geliyor. Veri tabloları görüntü değildir ve dolayısıyla bu şekilde ele alınmamalıdır. LaTeX'i manuel olarak bile son derece kolay otomatik olarak oluşturabilirsiniz.
alkazm

Yanıtlar:


12

Tabloları oluşturmak için LaTeX'i kullanırım, çünkü süslü görünüyorlar ve bir görüntü oluşturabilir veya doğrudan belgenize koyabilirsiniz. Bunu başarmak için aşağıdaki kodu kullandım:

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

Burada, belgenin previewiçeriğine, yani yalnızca tabloya yeniden boyutlandırılan bir görüntüyü döndüren belge sınıfı kullanılır. tabularVerileri sunmak için yalnızca bir ortam kullanılır. Hücreler arasında yatay ve dikey çubuklar vardır, ancak bunu değiştirmek çok kolaydır. Değişkende tab, veriler her satır için işlenir ve bir dizeye dönüştürülür. Bu konumda çıktı biçimini belirtmeniz gerektiğini unutmayın. Bunu %dher şeyin tamsayılara dönüştürülmesi için ayarladım .

Eğer bir lateks kaynağına doğrudan tablo kullanmak istiyorsanız, kaldırmak zorunda documentclassve \begin{document}aynı zamanda \end{document}bir değişkenlerde startve end. Son olarak, her şey daha sonra diske olarak depolanan bir lateks kaynağında bir araya getirilir table.tex. Yalnızca görüntünün sonunda olmasını istiyorsanız, sonuçta elde edilen dosya derlenir table.pdf.

İşte çıktı böyle görünüyor. Ama dediğim gibi, LaTeX olduğu için görünümü değiştirmek çok kolay :)

tablo

0'dan 100'e kadar rastgele sayılarla doldurulmuş büyük bir matrise (14 x 14) sahip başka bir örnek:

Tablo 2


8

Basit tabloyu çizmek için tableişlevini kullanabilirsiniz matplot. Ayrıca, grafiği PNG olarak kaydedebilirsiniz. Gereksinimleriniz için basit kod aşağıdadır:

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

Çizimin veya görüntünün boyutu figsize, satırdaki parametreler değiştirilerek ayarlanabilir :plt.figure(figsize=(x,y))

Daha iyi görünüm için aşağıdaki gibi değiştirilebilir:

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
Neredeyse bir şey yapardımfig = plt.figure(figsize = x.shape)
Daniel F

4

Belki bu yardımcı olur:

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')
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.