講習会「Python + Jupyter notebook による光赤外天文データ解析入門」
テキスト

開催日：2018 年 8 月 30 日―31 日
主催：国立天文台天文データセンター
講師：中島 康 (一橋大学)

はじめての Jupyter notebook

はじめてのjupyter notebook
1. jupyter notebookを使ってみよう
jupyter notebookを使うことで、対話的にデータ処理を行うことができます。 そして、その対話的な処理をメモと一緒にファイルとして保存することができます。
jupyter notebookは、もともとはipython notebookとよばれていたものをpython以外のプログラミング言語にも対応すべくグレードアップしたものです。julia, python, Rといった最近のデータサイエンスなんかで使われているプログラミング言語から文字をとってjupyterという名前が作られました。
https://github.com/jupyter/jupyter/wiki/Jupyter-kernelsによると40以上のプログラミング言語に対応しているとのことです。 もともとipython notebookだった
ので、jupyter notebookのファイルの拡張子は.ipynbになっています。

jupyter notebookの起動
コマンドラインでjupyter notebookを実行すると、デフォルトブラウザ内でjupyter notebookが起動します。
下のような画面がブラウザで表示されます。
(中身が空のディレクトリで起動すると、下のようにNotebook list emptyと表示されます。)

どこのディレクトリでも起動しますが、解析したいFITSファイルなどのデータがある作業ディレクトリで起動すると、データへのパスが簡単になります。 あるいは、私の場合は、自分の解析マシンにipynbファイルだけを集めたディレクトリを作っておき、 そこで起動してファイルを作成してから、作業ディレクトリに cd で移動することもあります。 この方法のよいところは、ipynbが自分の解析マシンの一箇所に集中して保存されるので、 ファイルの整理ができることです。

1

新規ノートブックの作成
右のNewからプルダウンメニューでPython3を選択します。

すると下のような新規ノートブック画面が出現します。

Pythonと対話してみましょう
Cellの中にPythonのコマンドを入力して[shift]+[enter]します。

コマンドの入力に対する出力が、そのCellの下に表示されます。
コマンドが複数行にわたる場合、[enter]で改行します。 そのCellを実行する場合には、そのCellをマウスで選択した状態で[shift]+[enter]します。

2

この対話を保存しましょう
上部のUntitledのあたりにマウスカーソルを合わせると、背景がグレイにかわるのでクリックします。

ファイル名を入力して、Renameボタンを押します。(Jupyterのバージョンによっては、OKボタン)

上部メニューバーの下のフロッピーのアイコンを押すと保存です。
デフォルトでは2分おきに自動保存されます。

3

ノートブックの終了
上部メニューバーのFileのプルダウンメニューの一番下のClose and Haltを選んで終了。

jupyterを起動したときの画面に戻ります。ちゃんと名前をつけたファイルができていますね。

ここで、ファイル名のリンクをクリックすれば、そのノートブックの実行および編集が可能になります。
ブラウザを閉じて終了です。
ターミナルを閉じます。

4ターミナルにてCtrl+Cでjupyternotebookのプロセスを終了させます。2. メモを書き込む ~ markdown
マウスのカーソルでCellを選んだうえで、jupyter notebookの上部のデフォルトでは Code になっている
ところをMarkdownにすると、そのCellに文章を書き込むことができます。markdown形式で文章を書き込めます。markdownでは、マークアップ言語であるhtmlよりもかなり簡単な表記ルールで、文章に構造を持たせることができます。
文字列を書き込み、[shift]+[enter]するとmarkdownのルールに従ったレイアウトで表示されます。

「簡単な表記ルール」とはいえ、markdownは面倒だと思ったアナタへ。
シンプルテキストで書き込めばよいです。最低限のメモの記録はできます。

5

3. 資料のダウンロードとファイルのオープン
資料のダウンロード
adc2018pythonのトップページの右の雲マークをクリックすると[DownloadZIP]などを選択できるので、そこをクリックしてください。するとあなたのPCのダウンロードフォルダに(例えば)zipファイルがダウンロードされます。

そのZIPファイルを展開するとadc2018pythonというフォルダが現れます。(自動的に展開されてるかもしれません) そのフォルダを、適宜、どこかのフォルダに移動してください。 そのフォルダの中に.ipynbファイルなどがあります。

ファイルのオープン(!!GUIでのファイルのオープンはできません。つまり、.ipynbファイルのアイコンをクリックしてもオープンできません!!) ターミナルでそのadc2018pythonのディレクトリに移動します。 そのディレクトリでjupyter notebookを実行すると、jupyter notebookが起動し、下のような画面が現れます。

6

この画面で、.ipynbファイルの文字をクリックすることで、jupyter notebookにて .ipynbファイルを開くことができます。

7

講習テキスト
講習 0 〜 70 --- Python

notebook
Pythonnotebook

PythonC

PythonPython()forimport

forC
1.
2.

関数

(print() range()math.

引数 一 前open())).() sqrt()

整数 順 返importsqrt()

math(1notebook
print(a)ipynb(In [7] )([Shift]+[enter]).ipynb

aimportjupyter notebook[tab]notebook

tot

[tab]

total

math.

[tab]

math
(foohoge): jupyter notebook

print( )jupyter notebook
1.

((2. print( )1.
2.

[shift] + [enter]): In [5] math.pi)()(jupyter notebook'1''(: In [7]jupyter notebook
print(a))

python)'1'

print( )print

2print( )print( )1 --- IRAF
IRAF

PythonCLpython + Jupyter notebook
1: IRAF

display, imexam, imstat,

IRAF

imarith(IRAF)

jupyter notebook

pythonIRAFIRAF
IRAFIRAF
python

pyraf
pyraf
pyraf

(python)

IRAF

iraf
mkiraflogin.cl(login.cl26800(4096'#set stdimage = imt800''set stdimage = imt4096'#)

login.cl

iraf.display()Cell)
login.clpyraf~/iraf/uparm/(imexam, imstat): ~/.iraf/login.cl
IRAF~/.iraf~/.iraf/login.cl~/iraf/login.cl

iraf

pythonstsdas(IRAF'Warning : sscanf library not installed on ... ')

data1

data2

Suprime Cam
FITS

2004-06-21
Suprime Cam 10CCD
data2
22(SMOKA
uncompress.sh()
bz2)

B
()
CCD
data1/SUPA00317705.ﬁts data2/SUPA00317702.ﬁts
52
OBJECT

FITS
data1/SUPA003175[0-6]5.ﬁts

()

B

10

data1/SUPA00317705.ﬁts

target1

B

10

data1/SUPA00317885.ﬁts

target2

B

30

B

10

data2/SUPA003175[0-6]2.ﬁts
data2/SUPA00317702.ﬁts

target1

B10

data2/SUPA00317882.ﬁts

target2

B

30

3

data1

55

jupyter

Unix

Unix

Unix

jupyter notebook

IRAF

DS9!

display, imexam, imstat

FITS

iraf.display
ds9

PyRAF

iraf.display

ds9(FAQ ~/iraf/login.cl

IRAFtarget1 5

set stdimage = imt800

display iraf

display800x800)

iraf.imexam
ds9m

FITS
qmar

imexam5x5()radial proﬁler(fwhm)

e4ariraf.imstat
FITS値
iraf.
iraf.unlearn()login.cl

uparm

unlearn()()

epar
iraf.epar('')
GUI(2017-07 MacOS Sierra + Python3.5.3 + Jupyter Notebook
iraf.epar('display')
2018-08 MacOS High Sierra + Python3.5.3 + Jupyter Notebook

GUICellprint()()

imstat()

行非表示
中身

戻 値

戻 値 返参考

文字列変換

変換
中身

5

UnicodeDecodeError)iraf.imstat
format
Stdout'# MIDPT MEAN STDDEV'

format='no'Stdout = 1

1()

out.split())

v

iraf.imarith

FITS

pixel

100

hoge.ﬁtshoge.ﬁts

33MB

IRAF
FITS

overwrite

66MB
()
IRAF

(append)imarith33MB((ﬂoat()v[0], v[1], v[2])

6v

FITS

2

help
help
help

(In[]:)(Chrome)

表示 長1
data1/SUPA00317885.ﬁts

1. imexam
2. imstat
3. imarith

target2

median, mean, standard deviation
pixel
median1. IRAF~IRAF

display, imexam, imstat, imarith

1.
2. ds9(display imexam% ds9 &(%)
3. login.cl
IRAF% cl4. display
ds9 frame1 FITS
cl> display example.ﬁts 1
5. imexam(ds9 FITS)
cl> imexam example.ﬁts 1ds9)m(standard deviationar(radial proﬁle6. imstat FITS pixelcl> imstat example.ﬁts ﬁelds='midpt, mean, stddev'
example.ﬁts pixel
7. imarith FITS
cl> imarith example.ﬁts - 1000 example2.ﬁts
exmple.ﬁtspixel
1000
example2.ﬁtsIRAF

display, imexam

PythonIRAF
iraf.display('example.ﬁts', 1)

2.

()

FITS
FITS

FITS

100

example.ﬁts

iraf.imstat

7fwhm)) 5x5 pixels

median10000example.ﬁts

imstatexample.ﬁts.ﬁts

1

2

example.ﬁts[0] example.ﬁts[1][]82 --- IRAF

1IRAF

(imarith, imcombine

IRAF: IRAF

jupyter notebook)

FITS

imstat, imarith, imcombine(1CCD'./data1/SUPA00317705.ﬁts')

target1((Suprime Cam)
) CCD

()

(imstat17)

imarithimcombine

1'./data1/SUPA00317505.ﬁts'

BCCDXY)

IRAF(Suprime Cam 5Y
2049

imstat

(FITS[2049:2080, * ]stddev()
X 20492080 Y

9984

18933

9984

Python[]1IRAFimarith

拡張形式9)
(*)

値 引

規格化

btarget1n5a.ﬁts ds9
7
iraf.imcombine'./data1/SUPA003175[0-6]5.ﬁts'

B

組 込

使

for

処理

imstat2'# MIDPT MEAN STDDEV'

glob.globfor使

out1, out2

1

ﬂoat()

10()

imcombine
iraf.imcombine('im01.ﬁts, im02.ﬁts, im03.ﬁts', 'out.ﬁts', combine='median')FITS
madian average
combine=''一番目 引数

文字列

光文字列 数値 変換

引数

考慮削除

領域

与規格化

文字列

末尾 一文字 削除
中間領域

作成

値

下FITS

理解

表示

掃除 掃除,

72
2-1.
target2'./data1/SUPA00317885.ﬁts''bﬂatn5.ﬁts''btarget2n5.ﬁts'(B

2-2.
target12

2(1) './data2/SUPA00317502.ﬁts'(2) './data2/SUPA003175[0-6]2.ﬁts'(3):2+(sample5))'./data2/SUPA00317702.ﬁts'
2+(15)

51.

Y
0.1 x1Y
iraf blkavgline)

bias1.ﬁts(1,4100)

1

X

2080

11(YY123 --IRAF:

IRAF APPHOTAPPHOT

jupyter notebook

iraf.daoﬁnd iraf.phot
iraf.txdump

2

btarget1n5.ﬁts((25)iraf.imcopy)

拡張形式
iraf.imstat[ x1:x2, * ]FITSiraf.apphot(fwhm)

ds9

iraf.display

iraf.imexam

fwhm'btarget1n5trim.ﬁts'

iraf.display

ds9

aENCLOSED, MOFFAT, DIRECTqfwhm(pixels)

fwhm=7.0 pixel

median可

iraf.imstat.nclip = 33-sigma clip 313

69

7.4

apphotimportlogin.cl"A Reference Guide to the IRAF/DAOPHOT Package"
http://iraf.noao.edu/docs/photom.html (http://iraf.noao.edu/docs/photom.html)(daorefman.pdf)

背景値 戻星 数
検出器 特有 値
検出器 特有 値
積分時間
以上

星

除検出決

背景決

等級
対話的 確認

行点
設定

iraf.daoﬁnd(ds9FITS
3targetﬁts display

3)

daoﬁndFITS

coords='out.coo'

iraf.phot

output=14

iraf.phot

長iraf.txdump

xcenter, ycenter, mag, merr

INDEF
()0.2

INDEF

expr='merr<=0.2'

expr=''

Stdout=''(CCD)

Landolt(1992)

15

B

3()

()

3-2

B-V

()

SA104-330

15.894 (0.029)

17.593 (0.005)

1.699

0.594

15SA104-334

13.998 (0.006)

15.692 (0.001)

1.694

0.518

24SA104-335

12.292 (0.010)

13.860 (0.001)

1.568

0.622

4SA104-336

15.230 (0.010)

16.854 (0.003)

1.624

0.830

14SA104-L2

16.700 (0.033)

18.178 (0.008)

1.478

0.650

4-2Landolt
SA104-336 SA104-330(100.07

SA104-334

2SA104-336)

1.672

0.03

result.txt

平方根 計算

行開

読 込
等級

改行列目

書 出 先削除

空白文字 行 分割変換
引書 出magmerrnumpy(result.txt)

32-1'btarget2n5.ﬁts''btarget2n5.ﬁts'

target1(1.672)

16

1.672

0.03

B-V

4 --- Numpy
5IRAF

FITS

Numpy

Numpy
python

Numpy

Numpy
ndarrayndarray

numpy'': ndarray1ndarraynumpy

ndarray2
ndarray()

python

+

*

for

Numpy
Numpy

ndarrayndarrayndarraynumpy~1
import一般的
numpy.array省略

pythonndarrayndarray

内容型 含型ndarray+17

表記

ndarray
astropy.io.ﬁts

matplotlib

ndarray~2[]

np.array()ndarray

Python0myarrX
astropy.io.ﬁts

Y()(x, y)IRAF
FITS[ 1: 2048, * ]ndarray
IRAF [ 1: 2048, * ]PythonPythonIRAF[ : , 0:2048 ][a : b]1:axb(Pythona, b018)
0:2048(y, x)

1

2

2

1

範囲 最後場合()

最後 省略

1FITS

ndarraybnnparray

numpy

(1) ~

+

numpym

cell

np.

np.m

numpy.where()(np.where( )()?)

numpy.where( )

index

2-99

3
:()

19

np.where()numpy.zeros( )numpy.zeros( )

0

要素
numpy

pythonindex

ndarray(y, x)

numpyIRAF)

5x5

代入
0Cxyindex(2) ~imcombine

astropy.io.ﬁts + numpy(numpy.stack(), numpy.average(), numpy.median()

average median

1
3

1
1

a, b, cnumpy.stack()(medianmedian
np.median([average], axis=0)

mediansum20)

combineaxis=02
2() astropy.io.ﬁts

mediannp.append()
np.stack()
np.append()

次元 増

s1

np.empty()
forndarray

np.empty()

空次元

形状 各次元

2x3

ndarray

2x2x3

取得

ndarray

21

averagenumpyNumpy
numpy.loadtxt()(3) ~Pythonndarray

指数表示禁止numpy.loadtxt()()np.savetxt()

ndarray

fmt

4(1)

numpy

(2)

3

numpy.stack() numpy.median()

1.
2

122

行 必須

astropy.io.ﬁts

Y2.
Python[]()23

5 --- astropy.io.ﬁts
FITS

pyﬁts

astropy.io.ﬁts

PyRAF
IRAF

astropy

http://docs.astropy.org/en/stable/io/ﬁts/index.html (http://docs.astropy.org/en/stable/io/ﬁts/index.html)

FITS

ndarraymatplotlib: IRAF

Pythonastropy.io.ﬁts
numpy
FITS

astropy.io

FITS

FITS
FITS

ﬁts

importgetdata getheader
ﬁts.getdata( )getdataﬁts.getheader( )ndarray

生

ndarray

numpy(np.std)ndarray[y, x][y_start:y_end, x_start:x_end]

3-sigma関数使getheader

FITS

24

header

print(header)

cell

FITS

表示 長
10[]
ﬁts.getdata( )

1
IRAF

Y
numpy

光 当

部分
部分
引 規格化
64

32

BITPIXOBJECT

BLANK
Warning25

ﬁts.writeto()FITS

ﬁts.writeto()ﬁts.update( )FITS部 値 負 大ﬁts.getdata( )ﬁts.getheader( )ﬁts.writeto( )値(astropy.io.ﬁts

ﬁts.open()

IRAF

combinenumpy.median(), numpy.append()

空 配列 作成

5IRAF

astropy.io.ﬁtsnumpy

割 算 回避10 x 10 FITS

代入

FITS

DS9'convinience functions'ﬁts.open()

FITS

target1

header

全反転x y26

作成注意).header
2.data55-1.

my10x10.ﬁts

DS95-2. astropy.io.ﬁts numpy(1) './data2/SUPA003175[0-6]2.ﬁts'(2) './data2/SUPA00317882.ﬁts'(3) trimming(2)

1.
numpyxy2+Y(numpy)

IRAF

軸 沿

整形

計算

次元配列

引 算生

継承Y

2. ﬁts.open()
FITS

ﬁts.open().info()

FITS

hdulist[0]FITS

hdulisthdulist[1]

読 取
読 取
1027.header.data

光 当部分
引部分
規格化
変更

BLANK.writeto'BLANK'

Warning

open

部 値 負 大28値

mode='update'close()

6 matplotlib
matplotlib
http://matplotlib.org (http://matplotlib.org)
https://matplotlib.org/gallery/index.html (https://matplotlib.org/gallery/index.html)
tutorials

examples

https://matplotlib.org/tutorials/index.html (https://matplotlib.org/tutorials/index.html)-: jupyter notebook

FITS

matplotlib

FITS

inlineinlinenotebook

matplotlib

pyplot3result1c.txt

ndarrayarray([[x, y,(1) x,mag(

matplotlib.pyplot as plt2)y(], [x, y,,2長( 4)numpy.loadtxt()], .... ] )merr2[:, 2] 23)

2

2

3

mag

最初

抽出

plt.hist()

29

merr

図数軸 範囲?

vs.
plt.scatter()30

範囲 色 指定

表記

FITS
FITS

IRAF

notebook
astropy.io.ﬁts

FITS

ndarray

BLANK

31

plt.cm.gray
plt.cm.[]http://matplotlib.org/examples/color/colormaps_reference.html (http://matplotlib.org/examples/color/colormaps_reference.html)

3

btarget1n5trim.ﬁts(vmin69vmax) med - std,med + 5 std

32

7.4

result1c.txt

XY

xcoo, ycoo
xcoo, ycoo
plt.scatter()

IRAF(1, 1)

Python(0, 0)

1

plt.scatter()
vss=100433

plt.xlim() plt.ylim()

34

35

上行 実行保存

63(1)(2) FITS'btarget2n5.ﬁts'
vsnotebook36

7 ---~

jupyter notebook

pythonpython3

FITS
getbackground( )37pythonnotebookpythonpython.py

unix/linux#!/usr/local/bin/python3.5
python pathmycode.py
jupyter notebook
jupyter notebook(chmod +xNew > Text File)cell38

targetﬁts

FITS

sys.argv[0]1sys.argv
sys.argv[1]notebook
notebook

notebook/home/nakajima/mypylib/mymodule.py
importpath

mymodule.py.py

import'mypylib'

mymodule.py

39

path

mymodule

importmymodule.getbackground( )/home/nakajima/mynotebook/notebook
cd

ipynb

JSON.ipynb
change directory

grep40