プログラミング関連の備忘録
情報がごちゃごちゃしてきたので自分用の備忘録を作成(随時更新予定)
ファイル入出力関連
バイナリ形式(.npz)でのnumpy配列の入出力
np.savez_compressedを使えば大分容量小さく保存できそう
# ndarray narr1 = np.array([1,2,3]) narr2 = np.array([4,5,6,7]) np.savez_compressed('filename', name1 = narr1, name2 = narr2) #narr1, narr2をname1, name2という配列名でfilename.npzへ書き出し # npzファイルの読み込み arr_names = np.load('filename.npz').files # arr_names > ['name1', 'name2'] arr_list = ['rarr1', 'rarr2'] for name, arr in zip(array_names, arr_list): exec(f'{arr}=np.load('filename.npz')[{name}]')
バイナリファイルへの数個程度の数値の入出力
from struct import pack, unpack, calcsize a1 = 2017 a2 = 3.1415 a3= 'hello' # これらを書き出す format = 'id5s' #4 bytes signed integer (a1), 8 bytes float (a2), 5 length string (a3) size = calcsize(format) #byteのサイズを取得 b = pack(format, a1, a2, a3.encode()) #a1, a2, a3をバイト型へ変換 f = open('filename.dat', 'wb') #書き出すときは普段のopenでのwではなくwb f.write(b) f.close() #読み込み f = open('filename.dat, 'rb') d = f.read(size) f.close() print(unpack(format, d))
numpy配列のテキストファイルへの出力
np.savetxt('filename.txt', ndarray)
配列の長さを記録しておかないと、たぶん読み込みは面倒くさい(やったことない)
.savファイル読み込み
import scipy.io as sio sav_file_path = 'D:/dir1/dir2/filename.sav' df = sio.readsav(sav_file_name) #clss : 'scipy.io._idl.AttrDict' # df内の配列を取り出すときは辞書のキーを指定(df['flux'])
.cdfファイルの読み込み
import cdflib cdf_filepath = 'D:/dir1/dir2/filename.cdf' data_cdf_read = cdflib.CDF(cdf_filepath) #cdfファイルの読み込み print(data_cdf_read.cdf_info()) # cdfファイルの情報を出力 # データの取得 epoch = data_cdf.varget('epoch') #epoch arrayの取得 var1_data = data_cdf.varget('varname1') data_cdf.close() #ついでに、epochからunix timeへの変換 unix_time = np.array(cdflib.cdfepoch.unixtime(epoch))
Unix time関連
日付からUnixtime、Unix timeから日付への変換
import datetime # 2017年3月27日00:00:00をUnix timeへ変換 unix_t = datetime.datetime(2017,3,27,0,0,0, tzinfo=datetime.timezone.utc).timestamp() #tzinfo=以降を入れないとjstになる #datetime.datetimeクラスに.timestamp()をつける # Unix timeから時刻へ変換 datetime.datetime.fromtimestamp(unix_t, tz=datetime.timezone.utc) # tz=以降を入れないとjstで表示される(めんど) # ちなみに、年数だけとかを取り出すなら、 yyyy = datetime.datetime.fromtimestamp(unix_t).strftime("%Y") #文字列 2017 yyyymmdd = datetime.datetime.fromtimestamp(unix_t).strftime("%Y%m%d") #文字列 20170327
| 書式コード | 出力 |
|---|---|
| %Y | yyyy |
| %m | mm |
| %d | dd |
| %H | 時(24時間表記) |
| %I | 時(12時間表記) |
| %M | 分 |
| %S | 秒 |
| %f | マイクロ秒(6桁) |
epochからUnix timeへの変換
import cdflib unix_time = np.array(cdflib.cdfepoch.unixtime(epoch)) #epochは配列
グラフ描画関連
複数グラフの全体にタイトル
fig, axs = plt.subplots(nlows=4, ncols=4, sharex=True, sharey=True, figsize=(10, 8)) # 4×4のグラフ fig.suptitle('title', fontsize=10, y=0.9) # fontsizeで文字サイズ、x, y指定でタイトルの位置調整
print出力
printの設定を変える
長めの配列が改行されて比較しづらいときに1行にprintできる文字数の変更等
| パラメータ | 内容 |
|---|---|
| precision | 浮動小数点出力の精度桁数(int or None, default=8) |
| threshold | 要約を行う配列要素の総数(int or optional, default=1000) |
| edgeitems | 要約を行った配列の前後に出す要素数(default=3) |
| linewidth | 1行に出力できる文字数(default=75) |
| suppress | Trueだと浮動小数点数は固定小数点表記、Falseだと科学的記法(>1e3, <1e-4の場合)、default=False |
| nanstr | not a numberの出力の仕方, default=nan |
| infstr | inftyの出力の仕方, default=inf |
| sign | +の時、常に正の値の符号, -の時正の値の符号省略、default='-' |
| formatter | データのフォーマット指定、default=None |
| floatmode | 浮動小数点型の精度オプション |
| legacy | print出力のバージョン('1.13'指定でpython 1.13の印刷出力を近似), default=None |
# default print(np.get_printoptions()) # >> {'edgeitems': 3, 'threshold': 1000, 'floatmode': 'maxprec', 'precision': 8, 'suppress': False, 'linewidth': 75, 'nanstr': 'nan', 'infstr': 'inf', 'sign': '-', 'formatter': None, 'legacy': False} # 1行の文字数変更 np.set_printoptions(linewidth=100)
小数点以下の桁数変更
print(format(np.pi, '.2f')) # >> 3.14
出力を上書きする
from IPython.display import clear_output for i in range(10): clear_output(wait=True) print(i) time.sleep(0.5)
その他
複数行を1行に書く
fig = plt.figure(figsize=(8, 4)) ax1 = fig.add_subplot(121, polar=True) ; ax2 = fig.add_subplot(122, polar=True) # 極座標表示されたグラフが横に2枚
IDL
num = n_elements(array) # (arrayの長さ)×16の2次元配列を作成 f1 = fltarr(num, 16) & f2 = fltarr(num, 16) & f3 = fltarr(num, 16) # 成分をすべてNAN(float)埋め f1[*, *] = !VALUES.F_NAN & f2[*, *] = !VALUES.F_NAN & f3[*, *] = !VALUES.F_NAN