心理学実験プログラミング: Python/PsychoPyによる実験作成・データ処理 サポートページ

Pythonを用いて心理学実験を作成したり、簡単なデータ処理をしたりする手法を解説した本です。ここでは、本書に掲載されているコードと練習問題の解答例を掲載しています。また、本書に掲載できなかったPsychoPy APIの抄訳を掲載しています。

  • 2020/06/25
    • 「PsychoPyのバージョンアップに伴う変更点」という項目を作成しました。

  • 2019/02/20
    • N-back課題について、動作するサンプルプログラムの要望がありましたので作成しました。

  • 2017/11/03
    • 訂正情報を掲載しました。お詫び申し上げますとともに、ご指摘いただいた読者の方に感謝いたします。

  • 2017/04/06
    • 公開しました。

読者より、サンプルコード2-04.pyをPsychoPy2020.2.4で実行すると、fillColorの初期値を引数で指定しないと正常に塗りつぶされない現象が発生することをご指摘いただきました。これがPsychoPyの仕様変更によるものなのか確認してから修正するか判断したいと思いますので、当面は引数でfillColorを補っていただきますようお願いいたします。

stim1 = psychopy.visual.Rect(
    win, width=6.0, height=6.0, pos=[-4,0], lineColor=None,
    fillColor=(0,0,0)) # ←このように引数fillColorに適当な初期値を与える

訂正情報

PsychoPyのバージョンアップに伴う変更点

サンプルコード

展開して利用してください。

  • 第2章のサンプルコード (codes_chapter2.zip)

    • c.pngとo.pngはコード2.29で使用します。

  • 第3章のサンプルコード (codes_chapter3.zip)

    • dataディレクトリはコード3.1および3.2で使用します。

2.3.3節のN-back課題について、動作するサンプルプログラムの要望がありましたので作成しました。

練習問題の解答

PsychoPy API (抄訳)

PsychoPy APIの公式ドキュメント( http://www.psychopy.org/api/api.html )のうち、特に重要と思われるcore, visual, eventの抄訳です。ついでにguiも訳しています。厳密な対訳ではなく、十河の判断で省略したり追記したりしています。

本書の第1章、第2章を参考にしていただければおおよそ理解できると思いますが、 クラスの継承 が未解説なのでここで補足しておきます。

Pythonでは、クラスを作成するときに「既成の別のクラスを基にして追加したい機能、変更したい機能だけを記述する」ということが出来ます。これを継承(inheritance)と呼びます。例えばPsychoPyの視覚刺激の場合、draw()とういメソッドを持つことや、opacityというデータ属性を変更すると不透明度が変化する事は共通しています。このように多くの機能を共有するクラスをたくさん作りたい時に継承は便利です。

まず、全てのクラスの基になるクラスを作成し、ここに共通性の高い機能を作り込みます。これを基底クラスと呼びます。そして、基底クラスの機能を継承して、個別の処理を追加したクラスを作ります。これを派生クラスと呼びます。このようにしておくと、全てのクラスに共通する機能にバグが見つかった時に、基底クラスだけを修正すればその効果が派生クラスにも及びます。継承を使わずに作成していたら、最悪の場合すべてのクラスにひとつひとつ同じ修正を適用しなければいけません。

../../_images/inheritance01.png

継承について理解するためにはもっと説明すべきことがありますが、PsychoPy APIを読むにあたってはとりあえずこの程度のことを知っていれば十分です。さて、APIドキュメントでpsychopy.visual.Rectを見ると、

class psychopy.visual.Rect(win, width=0.5, height=0.5, **kwargs)

指定された幅と高さの長方形を描画する。ShapeStimの特別なケースである。バージョン1.72.00で追加された。

RectはShapeStimのパラメータのうちvertices, closeShape以外のすべてのパラメータを受け付ける。

としか書かれていません。これはRectにdraw()などのメソッドやopacityなどのデータ属性がないという意味ではなく、基底クラスから継承されたものは省略されているのです。継承されたものは全て省略するか、継承されたものも含めて全て記載するかどちらかにしてくれればわかりやすいのですが、原文のPsychoPy API documentではこのRectのように極端に省略されているものから、かなり詳しく書いてあるものまで一貫性がありません。抄訳では原則として原文に従っています。 ImageStim、TextStim、ShapeStim の3つには他の視覚刺激オブジェクトと共通の事柄について比較的詳しく書いてありますので、これらのクラスの説明を参考にするとよいと思います。