numpy配列値のマトリックスイメージを取得-グリッド内のピクセル値(色ではない)


9

私はオンラインで検索しましたが、これについて私が望んでいることは何も見つかりませんでした。

派手な配列を画像として保存したいのですが、カラフルな画像ではなく、対応するグリッド位置のピクセル値を白黒で表現したいのです。

例えば:

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で手動で作成することは非常に非効率的な方法のようです。
非常に危険な

5
逆に、画像へのラスタライズは非効率的な方法のように聞こえます。データの表は画像ではないため、そのように扱うべきではありません。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}の変数にstartend。最後に、すべてがlatex-sourceにまとめられ、としてディスクに保存されtable.texます。最後に画像だけが必要な場合、結果のファイルは次のようにコンパイルされます。table.pdfます。

出力は次のようになります。しかし、私が言ったように、それはLaTeXなので、見た目を変更するのは非常に簡単です:)

テーブル

これは、0から100の範囲の乱数で満たされた大きな行列(14 x 14)の別の例です。

テーブル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)
ダニエル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.