jupyter notebookにmatplotlibを使ってグラフを描画する

jupyter notebookにグラフを表示するためのおまじない

%matplotlib notebook

または

%matplotlib inline

notebookはグラフを操作できる。

inlineはグラフが画像になる。

グラフを書いてみる

%matplotlib notebook
# ライブラリの読み込み
import matplotlib.pyplot as plt
# グラフを描画する
plt.plot([1,2,3,4])

X軸、Y軸の値を指定する

%matplotlib notebook
import matplotlib.pyplot as plt
# X軸、Y軸の値を指定する
plt.plot([1,2,3,4], [2,4,6,8])

直線以外の描画

青円

plt.plot([1,2,3,4], [2,4,6,8], 'bo')

赤い下向き三角

plt.plot([1,2,3,4], [2,4,6,8], 'rv')

指定できる文字列は「Matplotlib documentation」を参照。

plt.plot([1,2,3,4], [2,4,6,8], 'bo')
plt.plot([1,2,3,4], [4,3,2,1], 'rv')
plt.plot([1,2,3,4], [7,7,7,7], 'g*')
plt.plot([1,2,3,4], [6,6,6,6], 'mp')

グラフにラベルをつける

%matplotlib notebook
import matplotlib.pyplot as plt
plt.plot([1,2,3,4])

# X軸のラベル
plt.xlabel('X Label')
# Y軸のラベル
plt.ylabel('Y Label')

軸の設定

X軸Y軸の範囲を指定する

%matplotlib notebook
import matplotlib.pyplot as plt
plt.plot([1,2,3,4])
plt.xlabel('X Label')
plt.ylabel('Y Label')

plt.axis([1,5,1,8])

axisの引数は、[X軸最小値, X軸最大値, Y軸最小値, Y軸最大値]となる。

X軸Y軸を表示しない

plt.axis('off')

他にも、’equal’,’scaled’,’tight’,’image’などの設定がある。

関数を描画

%matplotlib notebook
import matplotlib.pyplot as plt
import numpy

def sigmoid(x):
    return 1 / (1 + numpy.exp(-x))

x = numpy.arange(-5, 5, 0.1)
plt.plot(x, sigmoid(x))

Pythonでテキストファイルの改行コードをCRLFからLFに変換するには

Pythonでテキストファイルの改行コードをCRLFからLFに変換したい。

文字列を改行コードを指定してテキストファイルに保存する方法が見つからなかった。

バイト列にして保存することで実現できた。

環境

  • Windows 10
  • Python 2.5.1

手順

(1) 改行コードがCRLF(\r\n)になっているテキストファイルを読み込む。

with open('test1.txt', 'r', encoding='utf-8') as a_file:
  txt = a_file.read()

(2) 改行コードCR(\r)を削除する。

txt = txt.replace('\r', '')

(3) ファイルをバイナリモードで開く。

with open('test2.txt', 'wb') as a_file:

(4) ファイルに、文字列をUTF-8のバイト列にして保存します。

a_file.write(txt.encode('utf-8'))

ソースコード

#! python3

# テキストファイルから文字列を読み込む
with open('test1.txt', 'r', encoding='utf-8') as a_file:
  txt = a_file.read()

# 読み込んだ文字列のCR(\r)を削除する。
txt = txt.replace('\r', '')

# ファイルをバイナリモードで開く
with open('test2.txt', 'wb') as a_file:
  # 文字列をバイト列にして保存する
  a_file.write(txt.encode('utf-8'))

Sphinxでサイドバーの検索ボックスを非表示にするには

Sphinxでサイドバーの検索ボックスを非表示にするには、
何も記述しない空のsearchbox.htmlファイルを、_templatesフォルダーに配置します。

Pythonで if __name__ == ‘__main__’ をかっこよく書けるautomainを調べてみる

if __name__ == ‘__main__’をかっこよく書けるautomain | TRIVIAL TECHNOLOGIES on CLOUD」で紹介されていたautomainモジュールについて調べてみた。

Pythonでモジュールが直接実行されたかどうかを判断するとき、一般的には次のように記述する。

def main():  
    # do something

if __name__ == '__main__':
    main()  

automainモジュールを使うと、これを次のようにかっこよく書くことができる。

from automain import *  

@automain  
def main():  
    # do something

automainモジュールのコードを読む前に、ちょっとおさらい。

__name__には、直接実行されたときには’__main__’、importされたときはモジュール名が入る。

test.py

def main():
    print __name__

if __name__ == '__main__':
    main()

sample.py

import test
test.main()

直接実行したときには、__main__が出力される。

$ python test.py
__main__

importしたときは、モジュール名’test’が出力される。

$ python sample.py
test

だから「if __name__ == ‘__main__’:」でモジュールが直接実行されたかどうかがわかる。

さて、automainモジュールを見てみよう。

def automain(func):
    import inspect
    parent = inspect.stack()[1][0]
    name = parent.f_locals.get('__name__', None)
    if name == '__main__':
        func()

まず最初の行から。

import inspect

inspectモジュールは、型チェック・ソースコードの取得・クラス/関数から情報を取得・インタープリタのスタック情報の調査、の機能を持つ。

次の行。

parent = inspect.stack()[1][0]

inspect.stack()は呼び出し元スタックのフレームレコードのリストを返す。
フレームレコードは長さ6のタプルで、フレームオブジェクト・ファイル名・実行中の行番号・関数名・コンテキストのソース行のリスト・ソース行リストの実行中行のインデックスを格納している。

inspect.stack()の返値のリストの値は、[automainモジュールのフレームレコード,automain関数呼び出し元のフレームレコード]となる。

フレームレコードの最初の要素はフレームオブジェクトだから、parentはautomain関数の呼び出し元のフレームオブジェクトになる。

次の行を見てみよう。

name = parent.f_locals.get('__name__', None)

f_localsはフレームで参照しているローカル名前空間。
そこから’__name__’の値を取得している。

if name == '__main__':

で、’__main__’と比較して、直接実行されたかどうかを判断するという寸法だ。