ささモンメモ

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

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

過去2回の続きです。

smon.hatenablog.com

smon.hatenablog.com

2次元フーリエ変換

最後のプログラミングの課題で,(数値データで)円を作る→フーリエ変換する→フーリエ逆変換(して元に戻ることを確認)する,という課題があるので,これをPythonでやってみます。

実験ではC言語でひたすら書いてもらっているのですが,Pythonだと拍子抜けするほど短くなります。

円を作る
import numpy as np
import matplotlib.pyplot as plt

nx = 256
ny = 256

i0 = 132
j0 = 124
r  = 84.0

re = np.zeros((nx, ny))
im = np.zeros((nx, ny))

for j in range(ny):
    for i in range(nx):
        if (i-i0)**2 + (j-j0)**2 < r**2:
            re[j][i] = 100.0
            im[j][i] = 0.0
        else:
            re[j][i] = 0.0
            im[j][i] = 0.0           
            
re.tofile('redata.flt')
im.tofile('imdata.flt')

これで円ができあがり,実部データと虚部データが保存されます。

f:id:sasamon677:20181026012115p:plain

2次元フーリエ変換

続いて保存した実部データと虚部データを使ってフーリエ変換していきます。

import numpy as np
import matplotlib.pyplot as plt

nx = 256
ny = 256

#fltファイルの読み込み
ispace_re = np.fromfile('redata.flt').reshape((nx, ny))
ispace_im = np.fromfile('imdata.flt').reshape((nx, ny))

ispace_data = np.vectorize(complex)(ispace_re, ispace_im)  #実部と虚部を複素数型として統合
ispace_data = ispace_data.reshape((nx, ny)) #1次元データを2次元データに並べ替え

kspace_data = np.fft.fft2(ispace_data)      #2次元フーリエ変換
kspace_data = np.fft.fftshift(kspace_data)  #直流成分が左上の端に来るので,中央に来るようにシフト

k_re = kspace_data.real  #実部のみ抽出
k_im = kspace_data.imag  #虚部のみ抽出

plt.imshow(k_re)

k_re.tofile('redata_fft.flt')
k_im.tofile('imdata_fft.flt')

なんとフーリエ変換が1行で書けてしまいます。恐るべしnumpy!
波数空間(k空間)の実部はこのようになります。

f:id:sasamon677:20181026012515p:plain

2次元フーリエ逆変換

上記と逆のことをすればOK。

import numpy as np
import matplotlib.pyplot as plt

nx = 256
ny = 256

#fltファイルの読み込み
kspace_re = np.fromfile('redata_fft.flt').reshape((nx, ny))
kspace_im = np.fromfile('imdata_fft.flt').reshape((nx, ny))

kspace_data = np.vectorize(complex)(kspace_re, kspace_im)  #実部と虚部を複素数型として統合
kspace_data = kspace_data.reshape((nx, ny)) #1次元データを2次元データに並べ替え

ispace_data = np.fft.ifft2(kspace_data)      #2次元フーリエ変換
#ispace_data = np.fft.fftshift(ispace_data)  #直流成分が左上の端に来るので,中央に来るようにシフト

ispace_re = ispace_data.real  #実部のみ抽出
ispace_im = ispace_data.imag  #虚部のみ抽出
ispace_abs = np.absolute(ispace_re, ispace_im)

plt.imshow(ispace_abs)

ispace_re.tofile('redata_ifft.flt')
ispace_im.tofile('imdata_ifft.flt')

絶対値画像を出してみると,きちんともとの円に戻っていることがわかります。

f:id:sasamon677:20181026012737p:plain

まとめ

もちろんC言語も勉強しておく必要がありますが,Pythonの便利さも(特に専攻実験を受けた方には)伝わったかなと思います。

Python初心者にとっては専攻実験の内容を焼き直すのは結構いい練習になるので,もし興味のある方は遊んでみると面白いかも。

専攻実験を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ファイルとして保存できてしまいます。すばらしい。

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

大学でTAをしている専攻実験で,C言語でのプログラミングのテーマを扱っているのですが,Pythonでやってみようという企画です。

興味のある方はぜひ試してみてください。Cより記述量が圧倒的に少なくて済むので「あの実験はなんだったんだ…」という気持ちになるかもしれませんが。

Anacondaをインストールして,統合環境のSpyderを使っています。インストールは「Anaconda」でググってぽちぽちしていくだけなので非常に簡単です。

Hello World

print("Hello world")

なんとこの1行だけで,きちんと

Hello world

と表示されます。

和の計算

1から100,000までの和を求める計算です。

s = 0.0
for i in range(0, 100000):
    i += 1
    s = s + i
print(s)

実行結果はこちら。

5000050000.0

正しく計算できていますね。ちなみにfor文の条件指定は,0から始まる場合は

for i in range(100000):

のように省略して終わりの条件だけ書いてもOKです。

Pythonはインデントの深さでfor文やif文などの範囲が決まるので,カッコとかをいちいち書かなくていいのがありがたいです。
あと変数の宣言とか型指定をしなくてよいのもC言語と大きく違うところ。

追記

ここで出しているのはもともと実験の中でもサンプルコードを写経したりする基本的な部分だけで,これを見たからと言って実験でチートできるわけではないのでご安心(?)を。

横書き文書の句読点はどれが正しいのか

フォントとか文書の体裁とかの類の話は結構好きというかこだわるほうなんですが,その中でも前から気になっていたのは句読点について。

横書き文書ではおもに3通りの組み合わせがある

日本語はもともと縦書きだったわけですが,縦書きの句読点は「、。」一択だと思います。というかそれ以外見たことないです。

しかし,横書きとなるとおもに次の3通りの組み合わせが使われているようです。

①「、。」(点,丸)

②「,。」(カンマ,丸)

③「,.」(カンマ,ピリオド) ※カンマやピリオドは全角

 ここまで挙げると残りの「、.」(点,ピリオド)の組み合わせは?となるかもしれませんが,これはまず見ないので除外します。

ちなみに以前ついったーでアンケートを取ってみたことがあります。

こんなに種類あったっけと思った方はぜひパソコンを開いてみてください。WindowsであればIMEオプションの詳細から句読点の組み合わせを選択できるメニューが見つかるはずです。

f:id:sasamon677:20181020213637p:plain

で,僕はというとここまで読んでいておわかりのとおり②の「,。」を普段使っています。これには(いちおう)大きく2つ理由があります。

文科省文化庁)的には「,。」が正しいことになっている

まずは文部科学省の外局,文化庁が制定している「公用文作成の要領」。ここの中に次のような記述があります。

句読点は,横書きでは「,」および「。」を用いる。

 というわけでどうやら②が国の定める正式な横書き句読点だそうです。実際に文科省の検定教科書なんかを見ると,横書きのものはすべて「,。」で統一されています。教科書使っていたころはこんなこと気にしてなかったですが。

ただ,国の機関のHPなどを見ると,さすがに文化庁は「,。」で統一されていますが,ほかの省庁だと「、。」なんかも見られるのであまり守られている感じはないですね。

僕の大学のHPではページによって両者が混在しているような状況でした。

読点はカンマのほうが文章が締まって見える

もうひとつの理由は,読点が「、」よりも「,」のほうが文章全体が締まって見えるから。

「今回の実験では、前回よりも精度が向上し、以下に示す結果を得た。」

「今回の実験では,前回よりも精度が向上し,以下に示す結果を得た。」

 短い例文だとわかりづらいかもしれませんが,個人的には下のほうがすっきりとして見やすいように思います。

理系の文書では「,.」もよく使われる

理系の文書では,数字やアルファベットなどが多く登場します。そのときはやはり読点が「、」だとどうも座りが悪いんですよね。

「x, yを実数とし、a=1、b=2とする。」

「x, yを実数とし,a=1,b=2とする。」

やはりカンマを用いたほうが数字などとも相性がよい気がします。

さらに理系の文書の場合は,句点も「.」(ピリオド)を使うことが結構あります。理系大学生向けの教科書なんかは「,.」が使われていることが多いですし,論文も投稿先によっては「,.」が指定されているところもあると聞いたことがあります。僕も学部の卒論だけは「,.」で書きました。

普段は「,.」だとちょっと堅苦しい感じがするのと,カンマとピリオドの区別がぱっと見だとつきづらいので使っていません。

おわりに

 句読点も調べてみるといろいろ議論されているようで奥が深そうです。そして僕はいまだにスマホで読点をカンマに設定する方法を知らないのですが(カンマにしたいときはわざわざ記号から入力している),もしあったら教えていただきたいです…

アンケートなどの締切までの期間はどのくらいが適切か

大学での委員会的な活動やイベントの幹事なんかをしていてふと思ったことがこれ。

よくアンケートを取ったり集計したりする機会があったんですが,特に学生側の意見を吸い上げて大学側と交渉するとなるとアンケートの回収率が大事になってきます。

こういうお堅いものだけでなく,LINEの日程調整なんかでも同じことが言えるんじゃないでしょうか。

でも,これがなかなか集まらなくて苦労することが多いんですよね。そこで,アンケートの締切までの期間と回収率についてちょっと気になりました。

締切は思い切って短くしたほうがいいのでは

個人的には「ちょっと短すぎないかな?」ぐらいの締切がちょうどいいのではと思っています。特に最近は紙ベースではなくWebで回答するケースが多くなっているので,「その場で」回答してもらうことが重要なりそう。

急かすのも失礼かなと思って締切まで1週間ぐらいの余裕を持たせることも結構ありますが,そうすると「あとで回答しておけばいいや」となり,そのまま忘れ去られてしまうことが多い気がします。たぶん自分が回答する立場でもそうなってしまいそう。
結局,締切直前にリマインドを送ってからぼちぼち集まりはじめるという流れはあるあるです。

あまりに短すぎてもそもそも周知できないという問題がありますが,思い切って当日中~数日以内という短めの締切にすれば,「いま答えておかなきゃ!」となって回答率も上がるのではないしょうか。

 アンケートの内容などによって事情も異なるかもしれませんが,回答期間と回答率には相関があるような気がするので,調べてみたら面白いかもしれませんね。飲み会の幹事なんかにも応用できそう。

入試年度の表現は統一してほしい

高校生向けの塾でバイトをしているので,センター試験の廃止と,いわゆる新テスト(大学入学共通テスト)の導入というのは結構身近な話題なのですが,文科省大学入試センターの発表やニュースなどを見ていてすごく気になる点があります。それは導入時期の書き方についてです。

新テストは2020年から?それとも2021年から?

新テストの導入に関して,ニュースなどでは「2020年度から」と報じられることが多いと思います。文部科学省大学入試センターの資料でも「平成32年度(=2020年度)から」と書かれています。

もちろん「年度」というのはその年の4月~翌年の3月までのことなので,「2021年1月から」が正解となります(新テストもセンター試験同様1月に実施されることになりました)。

ここまではごく自然な話のように見えますが,実はこれ,非常に誤解を招きやすい表現なんです。実際に2020年1月からだと勘違いされている親御さんもいらっしゃいました。なぜこのような勘違いが生じるのでしょうか?

入試年度は入学年度で表すことが多い

各大学での案内や,予備校での資料などは,基本的に「○○年度入試」というと(「○○年度中に実施する入試」ではなく)「○○年度入学者のための入試」を表すことが多いです。たとえば,いまの受験生がこの冬に臨む入試は,2018年度入試です。

ということは,新テストは「2021年度入試から」導入ということになります。大学入試センターも試験案内にはこのような表現を使っています。それなのに,「2020年度の入試から変わる!」と言われると誤解してしまう人もいるでしょう。

2018年1月のセンター試験を「平成30年度試験」と案内している大学入試センターが,2021年1月の新テストを「平成32年度」と書くのはなんだか変な感じです。

誤解をなくすためにも,(せめて同一機関の中では)入試年度の表現は統一するべきではないでしょうか。

103万円はウソ!? 再確認したい扶養控除の「壁」

せっかく頑張ってバイトしたのに…

アルバイトで稼いだお金で親を泣かせたくはありませんよね。

今年は春休みにバイト先で社畜(?)生活を送っていたこともあり,アルバイトをする際の扶養控除の仕組みに関して改めて調べ直したので,ここでまとめてみようと思います。

「"103万円"ってのは聞いたことあるけど…」という人,きちんと仕組みを把握しておかないと取り返しのつかないことになるかもしれません!


「給与所得」と「雑所得・事業所得」を区別しよう!

所得には全部で9種類+その他(雑所得)があり,一言で「所得」「収入」といっても細かく分類されています。

給与所得とは,おもに勤務先から雇用される形で受ける給料やボーナスのことで,たとえば塾講をやったり,飲食店やコンビニで働いたりといった一般的なバイトで得られる収入のことです。
これに対し,個人契約での家庭教師は事業所得,模試の採点バイト,はたまたアフィリエイトなどといったものでの収入は雑所得としての扱いを受ける場合があります。

これらは税金や扶養控除の計算で扱いが変わってくるケースがあるため,「どの収入がいくらなのか」まで考えておく必要があります。


扶養控除のラインは「38万円」

まず大きなラインとなるのが,扶養控除のライン。すなわち「親の扶養に入れるかどうか」でしょう。これは,「年間の合計所得が38万円以下」というのが基準になります(基礎控除)。要するに年間所得のうち38万円分はノーカウントにしてあげますよ,というもの。携帯会社の無料通信分的なものですね。まずはこれが大前提です。
このラインを超えてしまうと,親の税金負担が重くなってしまい迷惑をかけることになります。親の所得にもよりますが,年10万円~20万円ほどの負担増になります。

特に,その年の年末時点で19歳~22歳の人は,控除額が特別に優遇されているぶん扶養を外れた時の負担増も大きくなってしまいます。


それって「103万円」では…??

扶養控除のラインといえば,「103万円」というのを耳にしている人も多いでしょう。これは半分正解で半分間違いです。

ではなぜ103万円という数字が出てくるかというと,「給与所得」には特別なオマケがついてくるからです。給与所得では,さらに65万円分がノーカウントになります(給与所得控除)。

これでようやく「103万円」と言われる理由がわかりましたね。38万円+65万円=103万円というわけです。
しかし,お気づきの方もいると思いますが,これはあくまでも「給与所得」の場合の話。それ以外の所得に関してはこの特別サービスの65万円分はついてこないため,容赦なく38万円でバッサリ…ということになります。なので所得の内訳をきちんと把握しておくことが大切になります。


採点バイト・個人契約の家庭教師などは要注意!!

最初の例でも挙げましたが,学生がよくやっているバイトでは,特にこのようなものが要注意と言えるでしょう。採点バイトの収入は「雑所得」扱いとする塾・予備校が多いようですし,個人契約での家庭教師は「業務委託」形態で「事業所得」あるいは「雑所得」扱いとなるケースが多いようです。(個人ではなく登録制のところでは派遣センターとの雇用契約の形になるため「給与所得」扱いになることが多いそう。ややこしい…)

特に掛け持ちしている場合も注意が必要です。たとえば飲食店バイトで60万円,個人の家庭教師バイトで40万円稼いだ場合,合計では103万円を超えないため大丈夫…かと思いきや,実際には次のように計算されます。

 給与所得:60万円-65万円=0円(もちろんマイナスにはなりません)
 事業所得:40万円-0万円=40万円

したがって,役所の計算上の所得は「40万円」ということになり,これは38万円をオーバーしているためアウト!なわけです。なかなか複雑ですね。

親を泣かせないためにも,バイト充している皆さん,今一度よく調べてみましょう!

 

P.S. 103万円を超えそうであれば120万円程度稼げば親の税金負担分の元もとれるかと思いますが,130万円を超えると今度は健康保険の扶養からも外れるため,自分で保険料を支払って国民保険に入らねばなりません。
さらに自分自身の所得にも課税されるようになるので,かなり負担が増えます。170万円程度稼がないと元が取れないようなので,このラインは踏み越えないようにしましょう…