忍者ブログ
日々の研究生活のメモ書きなど

■ 参考 : Python, formatで書式変換(0埋め、指数表記、16進数など)






文字列に対して、書式指定するときは str.format() でできる

■ 桁数を指定して0埋めするときは
print('zero padding: {:0=5}'.format(100))

出力は
zero padding: 00100
この例だと:0=で0埋めを指定、5は5桁になるように0埋め


■ 符号を露わに書いてほしいときは、
a=100
print('sign: {:+}'.format(a))

出力は
sign: +100


■ 数字の小数点以下の桁数を指定したいときは
a=1234.5678
print('{:.2f}'.format(a))
print('{:.6f}'.format(a))

出力はそれぞれ
1234.57
1234.567800


■ 数字を指数形式で表示してほしいときは
a=1234.5678
print('{:e}'.format(a))

出力は
1.234568e+03



■ 有効数字
この例だと3桁と4桁の場合
a=1234.5678
print('{:.3g}'.format(a))
print('{:.4g}'.format(a))



出力は
1.23e+03
1235
PR
やりたいことはcgi+pythonで、submitしてページが遷移した後に、そのページ生成に使ったパラメーターを少し変えてページの再生成がしたい
出力されたページにhtmlでボタンを用意しておいて、そのボタンを押すと少しだけ異なるパラメーターで同様のcgiが走るようにしたい





最初はformに入っているパラメーターをなんとか保持して、それをhtmlのformに代入しようかと思ったけど
formに入れるべき変数の数が20個くらいあって
それを全てパースするのは骨が折れる上に、もし変数が追加されたらそのパースする部分もまた編集しないといけないのでめんどくさい・・・
(一応formに隠れて変数を渡すのはhiddenってタイプを使えばできることは確認した)


解決は、一度cgiで生成されるURLをうまく使ってできた
cgiでpythonを走らせたときのURLは
http://coffee.guhaw.com/cgi-bin/my_good_script.py?para1=12345&para2=67890&date=2020/05/07
みたいな感じになってると思う

pythonで
import cgi
import cgitb

cgitb.enable()
form = cgi.FieldStorage()
って書くと、このformにURLの?以降が代入されてパースできるようになる

?以降の para1=12345&para2=67890&date=2020/05/07 はクエリ文字列と呼ばれる
この言葉で検索してると、このクエリ文字列を取得してそれをパースする方法がわかった

■ 参考 : PythonCGIでGETメソッド取得
import os
import cgi
if 'QUERY_STRING' in os.environ:
query = cgi.parse_qs(os.environ['QUERY_STRING'])
else:
query = {}
#ここまでおまじない

a = int(query['a'][0]) #データaを整数として読み込む
b = int(query['b'][0]) #データbを整数として読み込む
自分がしたかったのはクエリ文字列をそのまま取ってくることだったので、
str_query = os.environ['QUERY_STRING']
みたいにすればOK

このstr_queryに対して、パラメーターの一部を置き換えるような置換をしてあげればいい
文字数がわかってるときの任意の置換は↓の記事を参照

■ 参考 : 【python3】re.sub()で文字数が決まった任意の文字列を置換する


自分好みに置換したクエリ文字列が例えば
http://coffee.guhaw.com/cgi-bin/my_good_script.py?para1=12345&para2=99999&date=2020/05/7
だとして(2番目のpara2ってのの値が違う)
あとは生成したwebページにこのURLへのリンクを用意しておけばOK
それをクリックしたら、ほぼ同じパラメーターでcgiが動く
できたwebページにいくと、また同様にリンクがあるはず






今回は関係なかったけど、
str_query = os.environ['QUERY_STRING']
とかで、クエリ文字列を全部持ってきてからそれをパースする(分解して処理する)ときは以下の記事が参考になる

■ 参考 : PythonでURLのクエリ文字列(パラメータ)を取得・作成・変更


import urllib.parse
すると、いろんな関数が使えるようになる

ただ、cgiのクエリ文字列の場合はcgiモジュールの中にいろんなパースする関数があるので、
そっちを使ったほうが便利
form.getvalue("hoge")
form.getfirst("hoge")
とか

■ 参考 : 21.2. cgi --- CGI (ゲートウェイインタフェース規格) のサポート





余談やけど、
cgi.print_form(form)
とか
print(os.environ)
打つと、form関連の内容が見れる
なにかに使えるかもしれないのでメモ









■ 参考 : Pythonで文字列を置換(replace, translate, re.sub, re.subn)

pythonで置換する関数は
replace()
re.sub()
他がある

replaceは決まった文字列を決まった文字列に置換する
s = 'one two one two one'
print(s.replace(' ', '-'))
みたいな感じ
ワイルドカードは使えない




文字数が決まったワイルドカードを使いたいときはre.subを使う
import re
a="12345678"
re.sub("12..", "1200", a)
結果は '12005678'
頭が12でその後ろに2文字の何かが付いてるときにそれを1200に置換する

最初はここを*でやってたら、うまくいかなくて詰まった・・・・







pythonで動くwebツールを使ってて、もしかして、このwebサーバーでJupyter Notebookを動かせたら便利なんじゃね?と気づいた

Jupyter Notebookのインストールは
pip install jupyterlab --user

インストールが完了したら、webサーバー上でNotebookを立ち上げる
jupyter notebook --no-browser --port=7800


ローカルマシンでremote_serverのポートにポートフォワードする(トンネリング)
ssh -N -f -L localhost:8001:localhost:7800 remote_server

ローカルマシンのwebブラウザで http://localhost:8001/ にアクセスする
そしたら、トークンを入力するように言われる(パスワードみたいなものか?)

最初にnotebookを立ち上げたときに表示されたトークンを入力すれば、notebookが使えるようになる

終了するときは、ローカルマシンで
lsof -ti :7800 | xargs kill -9
を実行すればOK






■ 参考 : Jupyter 知っておくと少し便利なTIPS集

■ 参考 : Jupyter Notebookでコードの自動補完をする


によると、Notebookに
%config IPCompleter.greedy=True
と書いておくと、補完ができるようになる







python3でちょいちょいコードを書いてて計算時間が遅いことに色々とイラついてきた
本当はpythonなんか使いたくないんやけど、しょうがないから並列化処理をして早くする

幸い今回のジョブは完全に独立で走らせても最後にまとめられればOK、かつ計算の順番は問わないものなので並列化難易度はかなり低い




ひとまずpythonで並列化のためのライブラリがどんなものがあるのか調べてみた

2019年7月の記事でわかりやすくまとまってるのがあった
python3まで網羅してくれてるのでありがたい

■ 参考 : Pythonの並列処理・並行処理をしっかり調べてみた

thread : python2向けで古い

threading : python3で使える、threadの上位互換

concurrent.futures : threadingの上位互換

他にも
multiprocessing
Joblib
asyncio
とかがあるっぽい


最初の記事を読んでthreadingを使おうとしてみたけど、わからん・・・
その後、multiprocessingの方を使おうとしてみたがこれまたわからん
一応メモだけしとく・・・

■ 参考 : Python で並列処理(初めての人向け)

■ 参考 : [Python] マルチプロセスな処理を実装して、処理を高速化する

■ 参考 : pythonの並列計算(CPUの数だけ並列させる)





結局、joblibというライブラリを使って並列化する
コードはめちゃくちゃシンプル

# with multiple processing by joblib
def wrapper_parallel_function(i):
 parallel_function(arg1, arg2, arg3, data[i])
 return data[i]

out = Parallel(n_jobs=-1)([delayed(wrapper_parallel_function)(i) for i in range(len((data)))])

みたいな感じ?(元のコードの名前を変えて書いたので間違ってるかも・・・)

parallel_functionという関数がもともとあって、それを並列化したい
関数の引数は色々とあるけど、dataというリストについて並列化したい
引数がいっぱいあるので、それをまとめてラッパーを用意する

Parallelという関数でラッパー関数を並列化する
out = Parallel(....というところで、dataという配列を1つ1つラッパーに渡している

みたいな感じだと思う

■ 参考 : PythonのJoblibによる並列計算について

この記事にも書いてあるけど、並列化の処理の終了順がジョブ依存なので
出力される順番もランダムになる

それを回避するには記事のように出力結果にデータのindexを入れておき、
それを後でソートする方法がある









python local variable 'hoge' referenced before assignment nonlocal

ってエラーが出て詰まった・・・・

■ 参考 : UnboundLocalErrorについて考察してみた


global変数とlocal変数の違いでエラーが起こっているのかと思ってコードとにらめっこして該当箇所を探したが
自分のコードの原因はもっと単純やった・・・

1. 関数の中でhogeが返り値になってる
return hoge
2. 関数の中でif分岐があって、片方の分岐に入らないとhogeが定義されていない
3. return hogeとすると「hogeがないよ」ってエラーが出てた

なので、if分岐がONになるときはエラーが起こらず
if分岐に入らないときはエラーが起こってた

1時間くらいかかったわ・・・
ひとまず、自分のpythonのglobalとlocal変数への理解は正しいことは確認できた

globalはなんとなくわかるけど、nonlocalってのもあるらしい
違いはわからん
必要ならまた調べる





面白そうな記事があったのでメモ

■ 参考 : 他の言語に慣れた人がPythonを使ったときにつまずきがちな10のポイント










pythonの開発環境を整えるパッケージ管理ツール(?)としてよく名前を聞くのが、pipとかvirtualenv
調べてもイマイチわからん・・・
(というか、使いたくないpythonに色々と時間を取られるのが嫌)

今回、minicondaを導入するのは楽という話を聞いたのでやってみた

anacondaというのもよく聞く
minicondaとanacondaの違いは

■ 参考 : AnacondaとMinicondaの比較、どちらで環境構築するべきか


ざっくり中身の充実度っぽい
anacondaはなんでも入ってるけど、その分ファイルサイズが大きい
minicondaは最小限のパッケージなので、追加で必要なものは自分でインストールする必要がある

追加で必要なパッケージのインストールにはyamlというのを使えば楽っぽいので
今回はminicondaで環境を整えてみた
以下、メモ





# Miniconda をダウンロードするスクリプトをダウンロードする

% wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh

# ダウンロードする
# enterとかyesを打ってると設定が終わる
# 自動的に設定が~/.bashrcに追加される
% bash Miniconda3-latest-Linux-x86_64.sh

# 設定を歳読み込みするために、新しいterminalで作業をする
conda config --add channels conda-forge

# それぞれの業界で詳しい人が配布しているyamlファイルをダウンロードする

# インストールする
% conda env create --file hoge-py37.yaml

# activateする
% conda activate hoge-py37



conda関連で便利そうなコマンドメモ
# インストールされているパッケージ一覧をみる
% conda list

# パッケージをインストールしたいとき
% conda install numpy

# activateする
% conda activate hoge-py37

# yamlファイルを出力
% conda env export > hoge.yaml

このyamlファイルを人と共有すれば、相手にも同じ環境を作れるのでとても便利





前記事で書いたツールの中で非常に多岐に渡るオプションを取り回す必要があった
具体的にはプロットタイプ1~9に対して、プロットの範囲[xmin, xmax][ymin, ymax]
全部で36個ある・・・
もしプロットタイプが増えたらさらに増える

これを全部関数の引数にして渡すのはやばすぎる!!!

と数ヶ月前の自分も思ったらしく、どう実装したかというと
xmin, xmax, ymin, ymaxを全部のプロットタイプで同じものを採用するという・・・

プロットの範囲を辞書型のリストにしておけば、関数の引数に渡すのは1つで済むから楽じゃね?
と思い至ったのでそれを実装してみた
この記事は辞書型のメモ

(一応約2年前にpythonの本を1から全部読んで、そのときのメモに辞書型のことは書いてあった
読んでみたら、こいつ全然辞書型わかってねーなー・・・と笑ってしまった)








■ 参考 : とっても便利なPythonの辞書型について覚え書き
# 空の辞書を作成、これに追加していく
dic_range = {}
dic_range["xmin_plottype1"] = 0
dic_range["xmax_plottype1"] = 5
dic_range["ymin_plottype1"] = 10
dic_range["ymax_plottype1"] = 40
みたいな感じ
これをplottypeの分だけ全部回して、さらに例外処理もすればOK


辞書の要素を取り出すときは辞書にキーを代入すればOK
xmin = dic_range["xmin_plottype1"]
本当は辞書のキーに取り出したい要素のものがあるか調べたほうが安全だと思う
if "xmin_plottype1" in dic_range.keys():
 xmin = dic_range["xmin_plottype1"]
else:
# なんかデフォルトの代入するとか
 xmin = ...
ただ今回は事前に例外処理はしてるので、キーがxmin_plottype1の要素には何かしらの値が入ってるのでしなくても大丈夫












前にも出た記憶はあるけどなぜか記事にしてなかったのでメモ

原因は簡単で、自分が定義した関数の引数の順番がまずいという話
引数の順番で、デフォルト値付きの引数は一番うしろに固めて置かないといけない
def func(a, b=100, c)

みたいなのがだめ
def func(a, c, b=100)
はOK


■ 参考 : python3 SyntaxError: non-default argument follows default argumentはなぜ起こるのか













cgiからpythonを動かして色々とやるツールを少し前からちょこちょこ作ってる
その中で不特定多数のユーザーが走らせたコマンドを記録したくなった
いつ走らせたか、どんなオプションを使ったか
これをログに残しておく

そこで走らせた日付を知りたい

■ 参考 : Pythonで現在時刻・日付・日時を取得

import datetime
d_today = datetime.date.today()
print(d_today)
# 2019-02-04

とか
時間入りで日付を知りたいときはnowを使う

dt_now = datetime.datetime.now()

print(dt_now)
# 2019-02-04 21:04:15.412854


取得した日付をファイルに書き込むときはこれを文字列に変換すればOK
file.write(str(today) + "\n")







try :
 なんか処理
except :
 エラーが起こったときの対応
って書く

exceptのときに何が起こったのかエラーメッセージを取り出したい
ちなみにexceptのあとにエラーの種類によって細かく処理を分けることも可能
except IOError:
とか



exceptに分岐したときのエラーメッセージを知りたいときはsysかtracebackを使えばいい
import sys
try :
 なんか処理
except :
 print(sys.exc_info())
とか
import traceback
try :
 なんか処理
except :
 traceback.print_exc()
とか

後者のtracebackはなんかうまくいかなかった・・・







(2020/05/07 追記)

さらに詳しいエラーメッセージを出したいときは
except Exception as e:
 t, v, tb = sys.exc_info()
 print(traceback.format_exception(t,v,tb))
 print(traceback.format_tb(e.__traceback__))
って感じにする


■ 参考 : PythonのException発生時のTracebackを綺麗に見る











■ 参考 : 2. 文字列をリストに変換|split()メソッド
>>> hoge="AAA,BBB,CCC"
>>> hoge.split(",")
['AAA', 'BBB', 'CCC']

みたいな感じ
これで、htmlのフォームから渡されたオプションを区切って、pythonで使える










最初にやってた書き方
error_message = "This is failed. time ( " + str(gps_time +" ) should be smaller than...."
みたいな感じの書き方をしていた
gps_timeがint型だとすると、文字列に変換しないといけないので
str()を使う必要がある

この方法の欠点は、書き方が込みってしまうので
サクッと内容が理解できないこと






後々もっと便利な書き方があると知った

■ 参考 : Python3 文字列中に変数展開したい

print( 'Hello %s!' % 'World' )

area = 3.14 * 5 * 5
print("area is %f" % area )

hoge = 3
foo = 6
print( hogehoge = %d, foo = %f' % (cat, dog) )

って感じで、%を使う
%s : 文字列
%f : 浮動小数点(doubleとかfloat)
%d : 整数
%% : %を表示する
(%x : 16進法、%o : 8進法)

これらの代わりに最後にある変数を代入してくれる
2つ以上変数がある場合は( )で囲ってカンマで区切ればOK









いずれastropyを触ることがあったら、また詰まると思うのでメモしておく

■ 参考 : Quantity

astropy.units のドキュメント



こんな感じで物理の単位と数字をセットで取り回せる
>>> 1.25 / u.s
< Quantity 1.25 1 / s >
>>> [1, 2, 3] * u.m
< Quantity [1., 2., 3.] m> >
数字だけ、単位だけほしいときは、unitとvalueというメソッドを使えばいい
ずっとint()とかfloat()を使ってエラーが出て困ってた・・・・
>>> q = 2.5 * u.m / u.s
>>> q.unit
Unit("m / s")
>>> q.value
2.5
使いこなせば便利そうではある・・・柄こなせれば・・・・



■ 参考 : Astropyで宇宙論的な計算を行う

astropyでできることの日本語での説明
わかりやすい






(2020/02/27 追記)

またこの問題に遭遇したので大事な部分を赤字にしとく





import cgi
import cgitb
form = cgi.FieldStorage()
print('Content-Type: text/html; charset=UTF-8\n')
でhtmlフォームからの入力を取り出すことができる
すべての入力はformに入っている

printの行はとりあえず書いておく必要があるらしい





python2では
if formdata.has_key("op"):
 op = formdata['op'].value
else:
 print "op not found"
 show()
 sys.exit(1)

みたいにして書いていたらしい
has_key()ってめっちゃ簡単やんと思ってた調べてたけど、古い情報だったらしい

■ 参考 : cgi.FieldStorage() and .has_key() in Python3







同じページにやりたいことが書いてあったけど、
form = cgi.FieldStorage()
if 'hoge' in form:
 val_hoge = form['hoge'].value

みたいな感じでいいらしい

ただここで2時間ほどハマったのが、
formの内容が["hogehoge", "foo"]のときに"hoge"があると判断されてしまうということ・・・

print("hoge" in "hogehoge")
True
↑みたいに in は部分一致かを調べる

先頭の部分が一致してるかどうかを調べるには
import re
で re.match を使えばいいらしい
今回はそのまま in を工夫して使ってトラブル解決した










# local変数があるかの確認には
if 'myVar' in locals():
# myVar exists.

# グルーバル変数があるかの確認には
if 'myVar' in globals():
# myVar exists.




2つのテキストファイルを結合する必要があった
コマンドラインでいうところのcat

そんなに重いファイルじゃないから、cat hoge1.txt hoge2.txt > merged.txt みたいな感じのコマンドをシェルを呼び出す関数で実行しようと思ってた

が、いくらやってもうまく行かない・・・

■ 参考 : シェルコマンドを実行する

subprocess.call('cat hoge1.txt hoge2.txt > merged.txt ')でいけるかと思ってました

が、subprocessでリダイレクトとかパイプを使うのは大変っぽい


一応、subprocessだけでもできるらしい・・・
■ 参考 : subprocessモジュールでリダイレクト(>, >>)を実現する


しょうがないので、2つのテキストを開いて、1つにまとめる方法でやる。

■ 参考 : Pythonはテキストファイルを連結する


filenames = ["hoge1.txt"', "hoge2.txt"]
with open("merged.txt", 'w') as outfile:
for line in itertools.chain.from_iterable(itertools.imap(open, filnames)):
outfile.write(line)

これで一応うまくいった
■ 参考 : Pythonでのグローバル(global)変数の宣言方法
var = 1
def add_ten(x):
global var
var = 10
print var + x

add_ten(2) # 12
print var # 10
↑のリンクから借りてきました

1. 関数の外で変数を使う
2. 関数の中でglobalをつけて変数を宣言する
3. 関数の中で変数を使う
4. 関数の外でもその値が代入されてる









まずはテーブル名を取得する
teminalで
sqlite3 something.db
sqlite> .table
で表示するのが通常の方法

pythonだけでもテーブル名は見れる

■ 参考 : pythonでsqliteのテーブル名取得
import sqlite3
filepath="something.db"
conn = sqlite3.connect(filepath)
cur = conn.cursor()

# table一覧を取得する
tables=[]
cur.execute("select name from sqlite_master where type='table'")
for catalog in cur.fetchall():
 tables.append(catalog[0])
print(tables)

cur.close()
conn.close()
みたいな感じ





テーブル名がわかったら、次はそのデータをリストに代入する
import sqlite3
import numpy as np
filepath="something.db"
conn = sqlite3.connect(filepath)
cur = conn.cursor()

# table hogehoge を読み込む
cur.execute("select * from hogehoge")
list_h = cur.fetchall()
# transposed
list_h_T = (np.array(list_h)).T

cur.close()
conn.close()
list_hにhogehogeの中身をすべて代入する
[(1, 2, 3), (4, 5, 6), (7, 8, 9)]
みたいな感じで、リストの中にタプルが入っている
このままやとすごく使いにくいので、まずnp.arraryでarray型に変換する
その後で転置すると、

[[1, 4, 7], [2, 5, 8], [3, 6, 9]]

みたいな感じになる
これで list[1] をプロットすると元データのタプルの1列目をプロットすることができる


■ 参考 : Python: plot list of tuples






hogehogeというテーブルのカラム名を取り出したいとき
cur.execute("PRAGMA TABLE_INFO(hogehoge)")
cols = cur.fetchall()
# Pick up column name
col_si = [item[1] for item in cols]
print(col_si)







■ 一様乱数
from numpy.random import *
rand() #0~1の範囲の一様乱数を1個作る
rand(10) #0~1の範囲の一様乱数を10個作る


■ 正規分布に従う乱数を作る
from numpy.random import *
randn() #平均0, 標準偏差1の正規分布に従う乱数を1個作る
randn(10) #平均0, 標準偏差1の正規分布に従う乱数を10個作る

# 平均と標準偏差を変えたい場合は、normalを使う
normal(5, 2) # 平均5, 標準偏差2の正規分布に従う乱数



randint(100) で0~99の整数を1個作れる

randint(0, 100, 20) で0~99の整数を20個作れる


他にもリストからランダムに値を取り出す関数とかもある
random.choice(list_name) # list_nameから1個取り出す
random.choice(list_name, 10) #list_nameから10個取り出す


seed(100)のようにして、初期シードを手で与えることもできる





コマンドのヘルプが知りたいときは
# 下にrange関数の説明をダラッと表示したいときは
help(range)

# 簡単なヘルプを一時的に見たいときは
range ?

# range ?よりも詳細なヘルプを一時的に見たいときは
range ??

セルを切り取りたいときはセルの左をクリックして青色にしてx

セルの内容を貼り付けしたいときはv

セルの内容をコピーしたいときはc

新規セルを下に作りたいときはb
新規セルを上に作りたいときはa

vimのキーコンフィグと似てるらしい








下のページを見たらやり方がわかった

■ 参考 : Pythonでファイルの読み込み、書き込み(作成・追記)

■ 参考 : Pythonで文字列のリスト(配列)と数値のリストを相互に変換




やりたいことは all_data という配列に入っている数字の列を
1.11
2.22
3.52
54
2.56
みたいな感じで1つ1つ改行した状態で書き出したい

■ コード例
path_w = "hoge.txt"
str_all_data = [str(x) for x in all_data]
with open(path_w, mode='w') as f:
 f.writelines('\n'.join(str_all_data))
hoge.txtが出力名

新規ファイルを書き出すためにはmode="w"が必要
withの段落はなしでも動くが、ファイルをクローズする動作が別に必要になる(f.close)
なので、こっちのが楽でいいと思う

まず、write()での書き出しは文字列にのみ対応している
なので数字の配列は一度中身を文字列に変換しないといけない
それをやっているのが str_all_far= [str(x) for x in all_far]

write()とwritelines()の違いは確か両端に[]が残るかどうかだった気がする
要するに、配列として書き出しをするか、配列の中身のみを書き出すかの違い

writelines()で書き出すと改行コードが無視される
なので、joinを使って改行を追加する

f.writelinesの前はタブだけどここでは打てないので全角スペースにしてる(なんかコードをきれいに見せてくれるjsとかあるのだろうか)


これで、配列の数字のみを書き出すことができるはず
なんてめんどくさいんだ・・・ 絶対もっと楽にできる方法があるやろうけど、今回はこれでいいや






(2020/02/27 追記)

上記は1つの配列のみを出力する例だった
2つの配列を出力したくなったので調べてみた


1.11 2.22
2.22 4.44
3.52 3.1
54 0
2.56 9

みたいな感じのことがしたい


■ 参考 : Python:2つのリストを2列のテキストファイルに書き込む


何種類か方法が載ってる
1. zipを使ってcsv形式で出力する(カンマで数字が分けられるので嫌)
2. numpyを使う方法(numpyじゃなくてただのリストだからなんか嫌)
3. 上記の例の拡張版
4. 略
5. 略

今回は3の方法でいけた

■ コード例
path_w = "hoge.txt"
with open(path_w, mode='w') as file:
 for i in range(a)
  file.write(str(a[i]) + " " + str(b[i]) + "\n")
 file.close()
みたいな感じ








(2020/03/01 追記)

ファイルを新規作成じゃなくて追記したいときは
path_w = "hoge.txt"
with open(path_w, mode='w') as file:
 for i in range(a)
  file.write(str(a[i]) + " " + str(b[i]) + "\n")
 file.close()

mode='w'の代わりにmode='a'を使えばいい

■ 参考 : Python:Pythonでファイルの読み込み、書き込み(作成・追記)









■ 点線の補助線

■ 参考 : 【Python@matplotlib】matplotlib にて横、縦の補助線を描く方法について


上の例では
fig, ax = plt.subplots(figsize=(5,5))
のようにaxとか書いてるけど、それしなくてもいけるっぽい
xdata = np.arange(0, 6.28, 0.1)
ydata = np.sin(xdata)
plt.figure(figsize=(10,6))
plt.plot(xdata, ydata)
plt.hlines(0.8, -0.8, 0.8, "blue", linestyles='dashed') # hlines
plt.vlines([2, 3], -0.8, 0.8, "red", linestyles='dashed') # vlines
使ってる関数の説明
plt.hlines(yvalue, xmin, xmax, "blue", linestyles='dashed')
って感じ
yvalueのところにx軸に平行な直線をxmin~xmaxまで引く

plt.vlinesはその逆で
plt.vlines(xvalue, ymin, ymax, "red", linestyles='dashed')
xvalueのところにy軸に平行な直線をymin~ymaxまで引く

1つの値xvalueの代わりに配列でも使える


これでプロットした例↓
https://coffeepote.tumblr.com/post/185196541563







■ 領域塗りつぶしプロット

■ 参考 : Fill between two vertical lines in matplotlib
xdata = np.arange(0, 6.28, 0.1)
ydata = np.sin(xdata)
plt.figure(figsize=(10,6))
plt.plot(xdata, ydata)
plt.axvspan(2, 4, alpha=0.2, color="red")
使ってる関数の説明
plt.axvspan(xmin, xmax, alpha=0.2, color="red")

xmin~xmaxに帯を置く
(ここからオプション)
alphaを設定しないと、塗りつぶしなしの帯になる
colorで色を選択できる
他にも
plt.axvspan(xmin, xmax, ymin=0, ymax=1, alpha=0.2, color="red")
みたいにyの範囲を追加することもできる


プロット例↓
https://coffeepote.tumblr.com/post/185196652633






(2019/07/05 追記)

ヒストグラムにこの点線を引くときは、予めヒストグラムの最大値と最小値を知っていないと点線の範囲をきちんと指定できない

ヒストグラムの最小値と最大値を取得して、それを点線の範囲に代入してやればいい

■ 参考 : Python+Matplotlibでグラフに対して追加で縦線や横線を書く話


v = plt.hist(plist, bins=40, range=(0, 1), color="green")
plt.vlines(0.05, 0, [v[0].max()+2], color="orange", linestyles='dashed')

みたいな感じ






最初「python history」とかでググったら、本当にpythonの歴史が出てきて泣いた
「python 対話モード 履歴」とかで調べたら出てきた

■ 参考 : Pythonの対話モードの履歴を残す方法

これが一番良さそうだったのでそのまま採用〜
便利






(2019/10/25 追記)

きちんとコマンドをメモしておかないとリンク先が消えたときに自分が痛い目を見るのでメモしておく

と思ったけど、この方法でやってないっぽい
わかったらまた追記します













ググって見た感じ、pyzmqというモジュールのversionが古いのが原因っぽい
v16からv17に上げればOKだった
sudo port selfupdate
port outdated | grep "zmq"
sudo port upgrade py27-zmq
sudo port upgrade zmq

■ 参考 : Jupiter notebook のエラー 'AttributeError: type object ‘IOLoop’ has no attribute ‘initialized’'


ただ、そこまでして動くようになったjupyter notebookだけど環境設定で心が折れて使わなくなった・・・・










プロフィール
HN:coffee
職業:物理屋(自称)
趣味:映画鑑賞、登山
出身:大阪府の南の田舎
自己紹介:
import MyProfile
import coffee_pote from TWITTER
import amazonのほしい物リスト from WISH_LIST

print "生きてます"
print "コロナのせいで15万くらい損失出してますが、生きてます"

# 最終更新 2020/03/15
カウンター
カウンター カウンター
ブログ内検索
ツイートするボタン
リンク
相互リンク募集中です (Twitterにてお知らせください)

Demo scripts for gnuplot version 5
(gnuplotのさまざまなデモ画像と作り方がまとめられている、眺めているだけでできるようになった気分になれる)

gnuplotスクリプトの解説
(米澤進吾さんの個人ページ、gnuplotと言えばこのかた)

gnuplot のページ
(Takeno Lab、うちのブログがリンクされていたのでリンク返し)

とある物理の院生日誌~院生は社会へ旅立った~
(研究室の先輩の個人ブログ)

英語例文を見て自然に英語・英会話を学ぶ
(楠本慶ニさんの個人ページ、様々な情報の密度の高さに感動)

Twitterから映画の評価が分かる & 映画の鑑賞記録が残せる coco
(映画の感想をまとめられるサイト、いつもお世話になっています)

Astronomy Picture of the Day Archive
(天文や宇宙関連の最新の話題について画像とともにNASAが説明しているページ)

今日のほしぞら
(任意の時刻の空で見える星を表示してくれる、国立天文台が管理している)

GNUPLOTとアニメーション
(応用の項目の「見せてあげよう!ラピュタの雷を!!」あたりからすごすぎる)

読書メーター
(読んだ本をリストできる便利なサイト)

flickr難民の写真置き場
(20XX年、flickrは有料化の炎に包まれた。あらゆるflickr無料ユーザーは絶滅したかに見えた。 しかし、tumblr移住民は死に絶えてはいなかった。)

教授でもできるMac OS X へのLaTeX, X11, gccのインストレーションと環境設定
(阪大の山中卓さんのwebページ、タイトルにセンスが溢れている、内容は超充実してる、特にTeX関連、学振DCとかPDの申請書類作成時にはお世話になっております)

英語論文執筆用の例文検索サービス
(とんでもないものを見つけてしまった・・・・ arXivに収録されている 811,761報の 英語論文から,例文を検索するための検索エンジン)


Template "simple02" by Emile*Emilie
忍者ブログ [PR]