プログラミング関連の備忘録

情報がごちゃごちゃしてきたので自分用の備忘録を作成(随時更新予定)

ファイル入出力関連

バイナリ形式(.dat)でのnumpy配列の入出力

ndarray.tofile('filename.dat', format='%fmt')  #filename.datへ書き出し

data = np.fromfile('filename.dat') #filename.dat内の配列の読み込み

fmtの形式

format type(size)
f float (4 bytes)
d double (8 bytes)
q signed integer (8bytes)
Q unsigned integer(8 bytes)
i, l signed integer (4 bytes)
I, L unsigned integer (4 bytes)
h signed integer (2 bytes)
H unsigned integer (2 bytes)
c character (bytes of length 1)
b signed integer (1 bytes)
B unsigned integer (1 bytes)
s, p defined char length (ex. 10s)

バイナリファイルへの数個程度の数値の入出力

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行に書く

python

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