ささモンメモ

普段つぶやききれないことをこちらで

専攻実験をPythonでやってみた(その2)

前回の続きです。
smon.hatenablog.com

今回も,実験テキストでサンプルコードとして載っている部分をPythonで書いてみます。
自分でコーディングしてもらう部分や,考察に関わる部分などは一切触れていません。(授業・実験の公平性を期すためです)

正方形を描く

import numpy as np
import matplotlib.pyplot as plt

nx = 256
ny = 256

ar = np.zeros((nx, ny))

for j in range(ny):
    for i in range(nx):
        if 64 <= i <= 192 and 64 <= j <= 192:
            ar[j][i] = 100
        else:
            ar[j][i] = 0

plt.imshow(ar)

実行すると正方形が表示されます。

f:id:sasamon677:20181025013612p:plain

最初にnumpyとmatplotlibというのをインポートしていますが,numpyは数値計算ライブラリ,matplotlibはグラフ描画などに使うライブラリです。
とくにnumpyは関数や配列などを扱う際には必須のとても重要かつ便利なライブラリ。これのおかげで学術分野でPythonが使いやすくなっています。

また,

a < b < c  # a < b and b < c と同義

のように2つ以上の不等式を一発で書けるのも地味に便利。

サイノグラムの作成

逆投影を行う前のサイノグラムを数値データで作るという作業があるのですが,そのサンプルコードをPythonで書き直すとこんな感じ。

import numpy as np
import matplotlib.pyplot as plt

nx = 256
ny = 256
ntheta = 256

x1 = 32.0
y1 = 32.0
r  = 24.0

sino = np.zeros((nx, ny))

for k in range(ntheta):
    theta = 2.0 * np.pi * k / ntheta
    x0 = x1 * np.cos(theta) + y1 * np.sin(theta)
    
    for i in range(nx):
        x = i - nx/2
        
        if -r <= x-x0 <= r:
            sino[k][i] = np.sqrt(r**2 - (x0-x)**2)
        else:
            sino[k][i] = 0.0

plt.imshow(sino)

実行するとサイノグラムが表示されます。

f:id:sasamon677:20181025235712p:plain

さらにこの配列(sino)をバイナリ形式で保存したければ,

sino.tofile('sinogram.flt')

と最後に1行書くだけでfltファイルとして保存できてしまいます。すばらしい。