第0章: はじめに — Python と Jupyter の基礎¶
このチュートリアルは、Python も EEG もまったく知らない人を前提にしています。第1章から第8章では EEG・MNE 側の内容を扱います。この章では、それらの章に出てくるコードを一行残らず読めるようになるための最低限の Python の知識だけを扱います。もし Python を書いたことがあるなら、第1章まで読み飛ばしてください。(コードを書く前にまずGUIで触ってみたい場合は、この教程と同じワークフローを扱う、任意のMNELABコンパニオン ガイドもあります。)
見通しをよくするために、チュートリアル全体のロードマップを示します。
Jupyter ノートブックとは?¶
このファイルはノートブック、つまりセルの集まりでできたドキュメントです。セルには2種類あります。
- Markdown セル(このセルのように): 説明のための整形されたテキストです。実行はされず、読むだけのものです。
- コードセル: 実際に動く Python の命令です。これは実行すると、その結果がセルのすぐ下に表示されます。
VS Code では、コードセルをクリックしてから Shift+Enter を押すと実行できます(実行すると次のセルに移動します)。下のセルで試してみましょう。
print("この行がセルの下に表示されれば成功です。")
この行がセルの下に表示されれば成功です。
重要: セル同士は、ページ上に並んでいる順序ではなく、あなたが実行した順序でメモリ(記憶領域)を共有します。セル A が何かを作り、その下にあるセル B がそれを使う場合、B より先に A を実行しておく必要があります。出力がおかしく見えたり、何かの名前が「見つからない」と言われたりしたときの定番の対処法は、先頭からセルを再実行することです。VS Code のノートブックツールバーにある「Restart」はすべてを初期状態にリセットし、その後の「Run All」は全セルを上から順番に再実行します。これがすべてを確実に一貫させる、もっとも信頼できる方法です。
Python とは?¶
Python はプログラミング言語、つまりコンピューターに実行させたい手順を、正確に一段階ずつ書き表すための方法です。指示はテキストとして書き、コンピューターはそれを上から下へ読んで、書かれた通りに実行します。これが全体のアイデアのすべてです。以下の内容は、そうした指示を読むための語彙にすぎません。
変数: 値を入れておく名前付きの箱¶
x = 5 は「x というラベルの付いた箱を作り、その中に 5 を入れる」という意味です。これ以降、どこであれ x と書けば「その箱に今入っているもの」を指します。
x = 5
y = 3
print(x + y) # # 以降はコメント -- 人間向けのメモであり、Python はこれを無視する
8
このチュートリアルで実際に登場するデータ型¶
- 数値:
5、1.0、40.0 - 文字列(テキスト): 常に引用符で囲みます。例:
"eeg"、"auditory/left" - リスト: 順序を持つ並び。角括弧で書きます:
["Fz", "Cz", "Pz"]。[index]で1つの要素を取り出せます。番号は 0 から数えるので、最初の要素はmylist[0]です。 - 辞書:
key: value(キーと値)の組を集めた対応表。波括弧で書きます:{"auditory/left": 1, "auditory/right": 2}。mydict["key"]で値を取り出せます。この形は第6章のevent_idとして何度も出てきます。
channel_names = ["Fz", "Cz", "Pz"]
print("最初のチャンネル:", channel_names[0])
event_id = {"auditory/left": 1, "auditory/right": 2}
print("auditory/left のコード:", event_id["auditory/left"])
最初のチャンネル: Fz
auditory/left のコード: 1
関数の呼び出し¶
関数とは、名前の後に括弧を書くことで起動できる、あらかじめ用意された処理のことです。例: print(...)。括弧の中にあるものは、その処理への入力であり、引数(argument)と呼びます。
多くの関数はキーワード引数を受け取れます。これは name=value という形で名前を付けた引数で、意味が明確になり、順序も気にしなくてよくなります。
print("hello", "world", sep=" ... ") # `sep` は、項目の間に何を挟むかを指定するキーワード引数
hello ... world
この書き方は、後の章でも raw.filter(l_freq=1.0, h_freq=40.0) のような形でいたるところに出てきます。l_freq=1.0 と h_freq=40.0 はキーワード引数で、どちらの数値がどのカットオフを指すかを名前で明示しているので、どの数字が何を意味するのか迷うことがありません。
オブジェクトとメソッド(見分けられるようになるべき、最も重要なパターン)¶
MNE のコードのほとんどすべての行は something.do_a_thing(...) という形をしています。このドットには特別な意味があります。something はオブジェクト、つまりデータと、そのデータに対して自分自身で実行できる処理をまとめて持った塊です。このようにオブジェクトに紐づいた処理をメソッドと呼び、関数と同じように、ドットの後に書いて呼び出します。
すでに知っているもの、つまり文字列(テキスト)を使って、このパターンを確認してみましょう。文字列もオブジェクトであり、メソッドを持っています。
greeting = "hello world"
print(greeting.upper()) # .upper() は、文字列オブジェクトが自分自身に対して行えるメソッド
HELLO WORLD
後の章では、raw はあなたの EEG 記録を表すオブジェクトで、raw.filter(...)(「自分自身をフィルタする」)、raw.plot()(「自分自身を描画する」)、raw.copy()(「自分自身の複製を渡す」)といったメソッドを持っています。このように見えるようになると、次のコードは
raw_filtered = raw.copy().filter(l_freq=1.0, h_freq=40.0)
raw を取り、その複製を作り、その複製をフィルタし、結果を raw_filtered と呼ぶ」ということです。
ライブラリのインポート¶
ライブラリとは、誰か他の人があらかじめ書いて公開してくれた、大きなコードの集まりのことです。自分でゼロから作り直す必要がないようにするためのものです。mne はこのチュートリアル全体の土台になっている EEG/MEG 用のライブラリで、matplotlib はプロット(描画)を担当します。ライブラリはノートブックに import で取り込み、その中にあるものにはドットでアクセスします。例えば mne.io.read_raw_edf(...) は「mne ライブラリの中の io セクションにある read_raw_edf という関数を使う」という意味です。
import mne
print("mne ライブラリのバージョン:", mne.__version__)
mne ライブラリのバージョン: 1.12.1
エラーメッセージに慌てず対処する¶
赤いエラーの文字が表示されることがあります。これは普通のことで、何かを完全に壊してしまったサインではありません。Python はトレースバック、つまり問題に至るまでのコードの連鎖を、実際のエラーで終わる形で表示します。大事な習慣は、まず一番最後の行を読むことです。そこにエラーの種類が書かれていて、たいていは何が起きたのかを正確に説明しています。それより上の行は、コードのどこで起きたかを示しているだけで、エラーの意味がすでにわかってから役立つものです。
例(これは実行する必要のあるものではなく、出力例です):
Traceback (most recent call last):
File "<cell>", line 1, in <module>
event_id["typo_condition"]
KeyError: 'typo_condition'
KeyError: 'typo_condition' は「この辞書に、typo_condition という存在しないキーを求めた」という意味です。ほとんどの場合、単なるタイプミスか、中身についての思い違いであり、どちらも簡単に直せます。
チートシート¶
第1章から第8章を読む際は、これを手元に置いておいてください。出てくる構文パターンのほぼすべてをカバーしています。
| 見かける表記 | 意味 |
|---|---|
x = 5 |
x という名前の変数に値を格納する |
# some text |
コメント — 人間向けのメモで、Python には無視される |
"some text" |
文字列(テキスト)値 |
[a, b, c] |
リスト — 順序を持つ並び。mylist[0] で最初の要素を取得 |
{"key": value} |
辞書 — 対応表。mydict["key"] でその項目の値を取得 |
some_function(arg) |
関数を呼び出し、arg を入力として渡す |
some_function(name=value) |
名前付き(「キーワード」)引数を使って関数を呼び出す |
object.method(...) |
object に、組み込みの method という処理を実行させる |
object.copy() |
元のものはそのままに、独立した複製を得る |
import library |
あらかじめ書かれたコードライブラリを読み込む。例: import mne |
library.thing |
library の中の thing にアクセスする |
| 赤いトレースバックのテキスト | エラー — まず最後の行を読む |
これで、このチュートリアルのすべてのコードセルを読むのに十分な Python の知識が身につきました。ここから先は、説明はすべて EEG と MNE に集中します。見慣れない構文が出てきたら、それは上のチートシートに載っているパターンのどれかです。
次へ: 第1章 — EEGの基礎