Nhận hình ảnh ma trận của các giá trị mảng numpy - Lưới có các giá trị pixel bên trong (không phải màu sắc)


9

Tôi đã tìm kiếm trực tuyến và không thể tìm thấy bất cứ điều gì về điều này làm những gì tôi muốn.

Tôi muốn lưu một mảng numpy như một hình ảnh nhưng thay vì có một hình ảnh đầy màu sắc, tôi muốn một đại diện màu đen và trắng của các giá trị pixel ở vị trí lưới tương ứng của chúng.

Ví dụ:

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

Tôi muốn lưu hình ảnh này dưới dạng hình ảnh (.PNG) giống như sau:

sản lượng dự kiến

Mã hiện tại của tôi tạo ra một lưới và đặt các số bên trong nhưng rất khó điều chỉnh mọi thứ để làm cho nó có thể trình bày trong một bài nghiên cứu.

Vì vậy, thay vì đăng mã quá phức tạp của mình, tôi đã tự hỏi liệu có một hàm tích hợp nào để xử lý việc này trong một vài dòng mã không.


1
Có vẻ như tablesẽ là một nơi tốt để bắt đầu. Tôi đã không sử dụng nó đủ để đưa ra một câu trả lời tốt.
Warren Weckesser

1
Xem 'Bảng Demo' để biết ví dụ sử dụng table.
Warren Weckesser

4
Tôi sẽ sử dụng LaTeX cho một bảng mà bạn đang cố gắng đặt vào một tờ giấy, trái ngược với hình ảnh raster.
kiềm

@alkasm điều là ma trận thực tế của tôi lớn hơn nhiều (14x14 hoặc 28x28) và tôi cần tạo nhiều hình ảnh cho chúng, vì vậy, làm như vậy trong LaTex có vẻ như là một phương pháp rất kém hiệu quả.
lbragile

5
Ngược lại, rasterizing thành hình ảnh có vẻ như phương pháp không hiệu quả. Các bảng dữ liệu không phải là hình ảnh, và do đó không nên được xử lý như vậy. Bạn có thể tự động tạo LaTeX, thậm chí thủ công, cực kỳ dễ dàng.
kiềm

Câu trả lời:


12

Tôi sẽ sử dụng LaTeX để tạo các bảng, vì chúng trông lạ mắt và bạn có thể tạo hình ảnh hoặc trực tiếp đưa chúng vào tài liệu của mình. Tôi đã sử dụng mã sau đây để đạt được điều này:

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

Ở đây, lớp tài liệu previewđược sử dụng để trả về một hình ảnh được thay đổi kích thước theo nội dung của tài liệu, tức là chỉ bảng. Chỉ có một tabularmôi trường được sử dụng để trình bày dữ liệu. Có các thanh ngang và dọc giữa các ô, nhưng rất dễ dàng để thay đổi điều này. Trong biến tab, dữ liệu được xử lý cho mỗi hàng và được chuyển đổi thành một chuỗi. Lưu ý rằng bạn phải chỉ định định dạng đầu ra ở vị trí này. Tôi đặt nó để %dmọi thứ được chuyển đổi thành số nguyên.

Nếu bạn muốn sử dụng bảng trực tiếp trong nguồn latex, bạn phải loại bỏ documentclass\begin{document}cũng như \end{document}trong các biến của startend. Cuối cùng, mọi thứ được đặt cùng nhau trong một nguồn latex sau đó được lưu trữ vào đĩa dưới dạng table.tex. Nếu bạn chỉ muốn hình ảnh cuối cùng, tập tin kết quả được biên dịch thành table.pdf.

Đây là những gì đầu ra trông như thế nào. Nhưng như tôi đã nói, rất dễ thay đổi ngoại hình vì nó là LaTeX :)

bàn

Dưới đây là một ví dụ khác với ma trận lớn (14 x 14), chứa đầy các số ngẫu nhiên từ 0 đến 100:

ban 2


8

Bạn có thể sử dụng tablechức năng của matplotđể vẽ bảng đơn giản. Hơn nữa, bạn có thể lưu cốt truyện dưới dạng PNG. Dưới đây là mã đơn giản cho các yêu cầu của bạn:

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

Kích thước của cốt truyện hoặc hình ảnh có thể được điều chỉnh bằng cách thay đổi figsizecác tham số trong dòng:plt.figure(figsize=(x,y))

Để xuất hiện tốt hơn, nó có thể được sửa đổi như dưới đâ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
Tôi gần như sẽ làm một cái gì đó nhưfig = plt.figure(figsize = x.shape)
Daniel F

4

Có thể điều này sẽ giúp:

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')
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.