忍者ブログ
物理学者(ポスドク)による日々の研究生活のメモ書きです ( python/emacs/html/Japascript/シェルスクリプト/TeX/Mac/C言語/Linux/git/tmux/R/ポケモンGO)

データの中身を逆順にしたい
reverse = array[::-1]

import numpy as np
reverse = np.flipud(array)

reverse = np.flip(array)







PR

img2 = img.copy()

単純にimg2 = imgとしてしまうと、オリジナルのimgも修正されてしまう・・・・





サンプルコード
import cv2

# Load an color image
img_orig = cv2.imread(fname, cv2.IMREAD_UNCHANGED)
img = cv2.cvtColor(img_orig, cv2.COLOR_BGR2RGB)
height, width, _ = img.shape

HSV_lower=[21, 67, 230]
HSV_upper=[164, 210, 254]

# HSVでの色抽出
hsvLower = np.array(HSV_lower) # 抽出する色の下限(HSV)
hsvUpper = np.array(HSV_upper) # 抽出する色の上限(HSV)

hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 画像をHSVに変換
hsv_mask = cv2.inRange(hsv, hsvLower, hsvUpper) # HSVからマスクを作成
hsv_img = cv2.bitwise_and(img, img, mask=hsv_mask) # 元画像とマスクを合成

plt.figure(figsize = (12, 12))
plt.imshow(hsv_img, cmap = 'gray', interpolation = 'bicubic')
plt.xticks([]), plt.yticks([]) # to hide tick values on X and Y axis
plt.show()

# save fig as png
fname="hoge1.png"
cv2.imwrite(fname, hsv_img)
HSVは
・H : 色相 Hue
・S : 彩度 Chroma
・V : 明度 Value of Brightness





(2023/08/28 追記)

HSVの使い方メモ

HSV : Hue, Saturation, Value

HSVとは、色相(Hue)、彩度(Saturation)、明度(Value)の三つの成分からなる色の表現法のことで、RGBのような光の3原色(赤・緑・青)とは違う3軸で色を表現します。

① 色相(H):色の種類(例えば赤、青、黄色)
② 彩度(S):色の鮮やかさ。
③ 明度(V):色の明るさ。

HSV色空間は人間が色を知覚する方法と類似しているとされているため、例えば照明条件が変わっても色相にはあまり変化が及ばないなど、色の抽出がしやすくなるケースもあります。

■ 参考 : OpenCVによる特定色画素の抽出(RGB vs HSV)

Hは0~180の値のみを取るらしい
2倍すると、0~360度の角度に相当する
0~255ではないことに注意

わかりやすい画像
https://www.tumblr.com/coffeepote/726877360080683008

https://www.tumblr.com/coffeepote/726877386940055552



■ 参考 : 画像の色抽出 ~RGBとHSVでの色抽出~

hogeという辞書型があるとして、これのkeyでfor文を回したいときは
for key in hoge.keys():
 print(key)


keyじゃなくて値自体でfor文を回したい時は、
for val in hoge.values():
 print(val)








% import os
% hostname = os.uname()[1]
'hoge-MacBook-pro-6.local'


久しぶりにコードを書いてて、numpyのarrayをバイナリ保存方法の記事を探してみたが、書いていない!
こんなに頻繁に使っているのに・・・


■ 参考 : NumPy配列ndarrayをバイナリファイル(npy, npz)で保存


aaaというarrayがあるとして、以下のように読み書きする
1つのarrayを保存する時は、特に辞書型とかは気にする必要はない
import numpy as np

# これでaaa.npyとして保存される
np.save('hoge', aaa)

# 読み込む時は
bbb = np.load('hoge.npy')
複数のarrayを保存する時はまた使った時に追記する・・・・・





(2023/04/18 追記)

意外とnumpyのファイルサイズがバカにならないことに気づいたので、出力時圧縮させてみる

これはsavezの代わりにsavez_compressedを使えばOK
使い方は同じ

ただ、作成時に時間がかかるらしい






argparse、とても便利。

■ 参考 : argparse --- コマンドラインオプション、引数、サブコマンドのパーサー

とりあえず、ここを一通り読めば大体わかる・・・・日本語だし



■ 参考 : argparse






コピペですぐに使いたい時向けのメモ
import argparse

parser = argparse.ArgumentParser(prog="hoge.py", description="do hogehoge")
parser.add_argument('-i', '--configuration', required = True, choices = configurations, help = 'name of configuration')
parser.add_argument('-o', '--output', required = True, type=str, nargs='+', help = 'name of output')
parser.add_argument('-c', '--flag_do_something', action='store_true', help = 'flag to do something')

args = parser.parse_args()
output = args.output
configuration = args.configuration
flag_do_something = args.flag_do_something
choicesは選択肢がリストに入っていない場合はエラーが出る
ただし、これを使うと、引数は1つしか取れない
なので、choicesの選択肢の中から2つとってくるとかはできなくなる・・・・

それを実現してるのが2つめのoutputの方
こっちはchoicesはなし
nargs='+' というオプションのおかげで、何個も引数を取れる
--output A B C
とすると
args.outputの中に["A", "B", "C"]と入っている
--output A, B, C
とすると、カンマが入ってしまってうまく動かないので注意


action='store_true'
とすると、このオプションがないときはデフォルトでFalseが代入される
このオプションが呼ばれるとTrueが代入される
(デフォルトが逆にFalseになるstore_falseもある)










■ 過去記事 : List of named colors

とかmatplotlibのドキュメントで、148色の名前とかが表示されてる

が、全然使い方が書いていない・・・・

import matplotlib.colors as mcolors
import matplotlib.pyplot as plt
plt.plot(x, y, color=mcolors.CSS4_COLORS["skyblue"])

みたいな感じでOK


他にも

■ 過去記事 : matplotlib color for tasteful drafting

のように
colors = dict(matcolors.BASE_COLORS, **matcolors.CSS4_COLORS)
としておいてから、colors[coloname] でも指定できる








■ 参考 : color example code: named_colors.py

■ 参考 : [python] 辞書の結合


python3.5以降なら
d1 = {'one':1, 'two':2}
d2 = {'two':'ii', 'three':'iii'}
d3 = {'three':'III', 'four':'IV'}
d4 = {**d1, **d2, **d3}


python3.9以降なら
|という演算子で、2つの辞書型を連結できるらしい




plt.plot(x, y, label="hoge")
plt.legend(loc="upper right")
とかやると、右上にlegendが表示される
legen()でlocを指定しないとクッソ計算時間が掛かるので、位置は固定した方が良い・・・いや、マジで



枠外にlegenを置く方法もググったら色々と出てくる
bbox_to_anchorとかで位置を変えてやればいいらしい

■ 参考 : 備忘録:matplotlib の legend(凡例) の 位置を調整する

ただ、この方法でやってると画像からlegendがはみ出て全部表示されない・・・

plt.figure(figsize=[15, 9])
とかで図のサイズを横長にしても変わらず


■ 参考 : 備忘録:Pythonでグラフ凡例のサイズを自動調整する方法
plt.legend(loc='upper left', bbox_to_anchor=(1.0255, 1.0255))
plt.savefig('hoge.png', bbox_inches='tight')
のように、bbox_inchesというオプションを追加したら、画像内にプロットとlegendが入るようになった
ただ、legendの分だけ、図が小さくなるので最初から図のサイズを横長にしておく必要があるので注意









■ 参考 : matplotlib.pyplot.yticks

matplotlibのドキュメントによると

plt.yticks(10, 100, 1000)
とかすると、10, 100, 1000のところにticsを打ってくれる

yminとymaxを与えると自動的に1桁ずつticsを打ちたい
(調べても全然いい方法が出てこないので、力技でやっちゃう〜)




plt.yticks( 10**np.arange(np.floor(np.log10(ymin)), int(np.log10(ymax))+1, 1) )
logスケールなので、log10でyminとymaxの冪乗のみを取り出す
yminについては、floorで切り捨て
ymaxについてはintで切り上げをする
これだとarangeが1つ少なく出力するのでymaxの方は1を追加している

これは数字の冪乗成分のリストなので、10**で実際の数字に直す







import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111)

ax.plot(range(10))
ax.set_xlabel('X-axis')
ax.set_ylabel('Y-axis', color="red")

ax.tick_params(axis='y', colors='red')
plt.show()


labelの色は後からでも変えられる

ax.set_ylabel('Y-axis')
ax.yaxis.label.set_color('red')









hogeというarrayがあるとする
このarrayの要素が1以上かつ10以下のものだけを解析に使いたいとすると・・・
hoge[(1 <= hoge) & (hoge <= 10)]

&の代わりにandではダメ
条件式を()で囲わないとダメ




img_origという画像があったとして、そこから一部だけを切り取りたいときは以下のような感じで

最初の引数がy関連、その後がx関連
絶対、次また逆でやってしまうのでメモっておく

xmin = 160
xmax = 210
ymin = 695
ymax = 745

img = img_orig[ymin:ymax, xmin:xmax]







img[0, :]とimg[:, 0]がどっちがどっちかわからなくなることが多々あるが、

img[0, :]はy=0のデータ

img[:, 0]はx=0のデータ







(こんなん簡単だろ、と思ってましたが1~2時間はやってやっとできました・・・ なんで・・・)

opencvで画像を読み込むあたりは↓を参照

■ 参考 : 【python3, opencv】はじめての画像解析


fig = plt.figure(figsize = [12, 10])
fig.patch.set_facecolor('white')
ax = fig.add_subplot(111)
im = ax.imshow(img, interpolation='none', cmap = 'gray')
fig.colorbar(im)
fig.savefig('hoge.png')



x軸とy軸に何もticksを付けたくないときは、plt.xticks([]), plt.yticks([]) を追加する
fig = plt.figure(figsize = [12, 10])
fig.patch.set_facecolor('white')
ax = fig.add_subplot(111)
im = ax.imshow(img, interpolation='none', cmap = 'gray')
fig.colorbar(im)
plt.xticks([]), plt.yticks([]) # to hide tick values on X and Y axis
fig.savefig('hoge.png')













実際使うことはなかったけど、今後必要な気もするのでメモ

2つのarrayがある、例えばxとyとする

xはデータのindex相当のもので、順番がぐちゃぐちゃになってる
yはデータの値
xをソートするときに、yの順番も同時に同じようにソートしてほしい

■ 参考 : argsort: ソートに使うインダイスを取得

■ 参考 : [Python]Numpyデータの並べ替え


argsortを使えばOK
index = np.argsort(x)

これで、xをソートしたときのindexを取得できる
x_new = x[index]
としたら、単純にxをソートしたことになる

indexを使って
y_new = y[index]
としたら、「xをソートするときに、yの順番も同時に同じようにソートしてほしい」が実現できる











■ 参考 : Numpyで特定のindex以外を抽出する方法

■ 参考 : Numpy で特定のインデックス以外の要素を取り出す

arrというndarrayに条件を掛けて、条件を満たす成分をarrから抜いて、別のarrayを作成する
例えば、arrの中身がx0より大きいものだけ取り除きたいときは、
index = np.ones(len(arr), dtype=bool)
for i in range(len(arr)):
 if arr[i] > x0:
  index[i] = False
new_arr = arr[index]
他にもindex[i] = Falseをindex[i-5:i+5] = Falseとかすれば、x0より大きいインデックスの前後5成分も同時に弾ける










Seleniumを使えばいいらしい

■ 参考 : 面倒なブラウザ操作をSeleniumを使って自動化する

いつか使えそう











webブラウザ上にあるオプションを使って、pdfに書き出そうとしてもxelatexみたいなのがないよ、と怒られる

ずっと諦めてたけど、実はコマンドラインからはpdfに出力できるっぽい
jupyterからlatexが見えていないだけ?(もしくは自分がインストールしたtex liveを使ってるのか?)
jupyter nbconvert --to pdf filename.ipynb








pythonのpandasでcsvを開いて、条件を満たす行に加工をする + ある行をファイル末尾にコピーして追記したい

pandasというのを使うのは初めてだった
・勝手にindexという列ができていたり、そのindexは加工不可だったりで色々と大変だった・・・
・astropyの単位みたいに、printしたら勝手にヘッダーにあるkeyも表示されてたりしてその対処が必要
・ある列、ある行の要素を取り出すのに、リストみたいに通し番号で指定できるのかと思ったらそれはできなかった・・・ ilocといかいうのを使う必要がある


コード
import pandas as pd

df = pd.read_csv('hoge.csv')

fname="hoge.png"

# このcsvの中で、filenameという要素で"hoge.png"を含んでいる行を抽出する
print(df[df["filename"] == fname])

# もしその行の通し番号が欲しかったら
list(df[df["filename"] == fname].index)
# これで
# [13, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 134, 180]
# が手に入る

#
# filenameという要素がhoge.pngを含んでいる行のdateを更新する
# 頭にシャープをいれてコメントアウト(csvのコメントアウトの文字はないと思うけど、読み込めなくできればOKなので・・・)
#
ll = df[df["filename"] == fname]
line_to_add = ll.iloc[0].values
for i in list(ll.index):
 df.loc[df.index==i, ["date"]] = "#" + df.loc[df.index==i, ["date"]]

# ファイルの末尾に、ある行をコピーして追記する
n = len(df["aaa"])
df.loc[n] = line_to_add

# 追加した行の他の要素を修正する
df.loc[n, ["x"]] = 1111
df.loc[n, ["y"]] = 2222

# 修正後のdfをcsvとして保存する
df.to_csv('hoge.csv', index=False)




以下、メモ

pd.read_csvはファイルを開いて、読み込んで、さらに閉じてくれるのでその後の処理が楽

■ 参考 : pythonでのcsvファイルの読み込み

最初はpandasのreplaceでなんとかすればいいと思ったが、うまくいかなかった

■ 参考 : pandas.DataFrame, Seriesの要素の値を置換するreplace



pandasで読み込んだcsvのindexをいじりたいとき用↓
df1 = df.set_index("filename")
とか

■ 参考 : pandasでcsvの読み込みをしてIndexをいじってみる


■ 参考 : pandas.DataFrameの列をインデックス(行名)に割り当てるset_index



いつか使うかも
これは便利そう
indexにdatatime型を指定すると、ある日付の範囲のデータのみを取り出す、とかがかんたんにできる
■ 参考 : pandasのindexはdatetimeにすると便利



ファイル末尾に追加する方法について
最初はappendでやろうとしたが、うまくいかなかった

一応メモ↓
■ 参考 : pandas.DataFrameに列や行を追加(assign, appendなど)

今回は
n = len(df["gain"])
df.loc[n] = df[df.index==13].values[0]
みたいにして追加した

任意の位置の値を取得するには at, iat, loc, ilocを使う
今回はilocしか使ってないけど・・・

■ 参考 : pandasで任意の位置の値を取得・変更するat, iat, loc, iloc



ilocとかを使わずにdfをfor文に打ち込むと、warningが出る
chained indexingというらしい

■ 参考 : pandas の SettingWithCopyWarning で苦労した話

■ 参考 : pandasのSettingWithCopyWarningの対処法






修正したdfをcsvでもう一度書き出す方法
index=Falseを付けないと、indexという列が新しく追加されるので注意
あと、headerがいるかどうかも選べる

■ 参考 : Pandasのto_csv関数を使ってCSVファイルに書き出す方法





(2022/12/19 追記)

data frameの仕様でハマったのでメモ

data frameの内容をコピーするのに = を使うと参照渡し(C言語のアドレス)みたいなことになって、単純な値をコピーすることにはならない
コピー元が修正されたら、=の左辺も置き換わってしまう(ここにハマった・・・)

(これは別にdata frameに限った話じゃなくてpythonもこういう仕様らしい、が今の所これで変なことが起こったことはないんだよなぁ・・ 謎)

単純な値のコピーをしたいなら、
hoge = df.copy(deep=True)

deepcopyというのは新しいidで作成されるので、新しい変数になる






今までやってたのはかなり力技だった

データがxとyというリストに入ってる
labelsがそれぞれのサンプル点の横に打ちたいラベル
import matplotlib.pyplot as plt
for i, text in enumerate(labels):
 plt.text(x[i]+4, y[i] +0.2, text, fontsize=25)
こんな感じ
ただ、サンプル点が近すぎると、ラベルが重なってそれを調整する必要があった







■ 参考 :複数のplt.textで重なる文字をなんとかできる。

adjustText というパッケージを使えば楽に調整をしてくれるらしい
デフォルトでは入っていないので、condaでインストールする
conda install adjustText
使い方は記事に書いてある通り
texts = [plt.text(x[i], y[i], '%s' %labels[i], ha='center', va='center', fontsize=18) for i in range(len(labels))]
adjust_text(texts)
みたいな感じでOK

矢印をつけるオプションも使ってみたけど、今回はサンプル点とラベルの距離が近すぎて、矢印いらなかった








from csv import writer

csvname="hoge.csv"
csvline=[a, b, c]

# only for the first time
if not os.path.exists(csvname):
 csvline_header=["a_value", "b_value", "c_value"]
 with open(csvname, 'a', newline='') as f:
  writer_object = writer(f, lineterminator='\n')
  writer_object.writerow(csvline_header)
  f.close()

with open(csvname, 'a', newline='') as f:
 writer_object = writer(f, lineterminator='\n')
 writer_object.writerow(csvline)
 f.close()
こんな感じで良いらしい
1回目はヘッダーを書き出すために、1度だけ実行する
2度目以降はファイルがあるので実行しない

a, b, cとかに書き出したい値を入れればOK







(2023/01/06 追記)

f.close()はwithで開いているので不要だと思う





(2023/08/28 追記)

書き出したcsvファイルの行末に、 ^M$ みたいなものがつくときがある
これは、CRLFというのが改行コードになっているから

■ 参考 : Pythonのcsvモジュールで出力されるファイルの改行コードをLFにする

↑のコードを一部修正して、lineterminator='\n'を追加した
writer_object = writer(f, lineterminator='\n')







import shutil
shutil.copy('dir1/hoge.txt', ''dir2/hoge.txt')

みたいな感じであるディレクトリの同じ名前のファイルをコピーしたい。

けどこのcopyさんはファイルの中身が同じだと、エラーを出してしまう(そんなチェックいらんやろ・・・)



ググった感じ、お手軽な解決方法はなかった。
オプションを1つ追加するとかでなんとかなるかな〜と思ったけど、tryとexceptとかなんでコピーするだけでそんなことをしないといけないのかw

■ 参考 : Disable SameFileError exception in shutil.copy





めんどくさかったので、シェルを呼び出してcpを呼び出した
import subprocess
cmd='cp dir1/hoge.txt dir2/hoge2.txt /dev/null 2>&1'
subprocess.run(cmd, shell=True)







■ 参考 : Pythonで深い階層のディレクトリを再帰的に作成するmakedirs
# 出力するフォルダを作成
if not os.path.exists(outdirname):
 os.makedirs(outdirname)

os.mkdir()だと、同じ階層にしかディレクトリが作れないが、os.makedirs()だと再帰的に作ってくれる

コマンドラインのmkdir -p みたいなもん








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

print "先月子供が産まれました!"

# 最終更新 2022/10/25
カウンター
カウンター カウンター
ブログ内検索
ツイートするボタン
リンク
相互リンク募集中です (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]