20210730のPythonに関する記事は25件です。

Spleeterを使って音源分離に挑戦

音源分離とは ここら辺の文献がわかりやすかったです。 使用した環境 Windows10 Python 3.8.2 必要なもの ・Python→インストール方法は各自で検索してください。 ・ffmpeg ・ibsndfile ・Spleeter ①ffmpegのインストール方法 ①ホームページ: http://ffmpeg.org ②ダウンロードをクリック ③Windows builds from gyan.devを選択する。 ④サイトの下の方にreleaseがあるので最新バージョンをダウンロードする。 ⑤ダウンロードしたファイルは「.7z」タイプの圧縮がされています。 解凍ソフト「7zip」をダウンロードする。 7zipダウンロードリンク: https://sevenzip.osdn.jp ⑥展開する ⑦展開すると「bin」というフォルダがあり、その中にffmpegのソフトが3種類入っています。ソフトは実行ファイル形式で、「ffmpeg.exe」・「ffplay.exe」・「ffprobe.exe」の3つがあります。 Cドライブにffmpegというフォルダーを作りそこにこの3つのソフトを移動します。 ⑧Pathを通します。 ここはの説明は省きます。 Pathの通し方: https://opty-life.com/apps/ffmpeg-windows-install/ ②ibsndfileのインストール方法 ①ホームページ: http://www.mega-nerd.com/libsndfile/ ②下の方にダウンロードがあるので自分の環境に合わせてダウンロード ③Spleeterのインストール方法 pipを利用すればインストールできます。 下のコードを実行する。 結構長いのであとはゆっくり待ちましょう? pip install spleeter 実行してみる from spleeter.separator import Separator import os # 出力結果の保存場所をあらかじめ作っておく for i in (2, 4, 5): # 2音源、4音源、5音源 outdir_path = './output/' + str(i) + 'stems' os.makedirs(outdir_path, exist_ok=True) # 分離対象となる音楽wav # https://soundcloud.com/ballforest/sample input_audio = "./input/sample.wav" # 初回実行時はモデルをダウンロードするため、「待ち」の時間がかかる # 事前にダウンロードすることも可能 (pretrained_model/2stems などに保存) # ボーカルとそれ以外に分離する(2音源) separator_2stem = Separator('spleeter:2stems') separator_2stem.separate_to_file(input_audio, "./output/2stems") # ボーカル、ベース、ドラムとそれ以外に分離する(4音源) separator_4stem = Separator('spleeter:4stems') separator_4stem.separate_to_file(input_audio, "./output/4stems") # ボーカル、ピアノ、ベース、ドラムとそれ以外に分離する(5音源) separator_5stem = Separator('spleeter:5stems') separator_5stem.separate_to_file(input_audio, "./output/5stems") 参考文献
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Python+tesseractでゲーム画面のOCRをしてみる

ゲームの金策をするためにエンジニアリング力をフル活用したいと思い、Python+tesseractでゲーム画面の文字取得をするところから始めてみようと思いました。 Windows10で行います。 使うもの Python tesseract OCRエンジンを含むパッケージ pytesseract Python向けラッパー 環境構築 1. tesseractのインストール forkしたこちら Home · UB-Mannheim/tesseract Wiki からのインストールを勧めている記事が多かったので信じてこちらから。 tesseract-ocr-w64-setup-v5.0.0-alpha.20210506.exe (64 bit) resp.をダウンロードします。 インストーラがダウンロードできたら実行しましょう。 インストールの過程で注意すべき点として。 今回は日本語をOCRする可能性もあるので、Additional language data(download)の中のJapaneseとJapanese(vertical)もインストールします。 もう1点、インストール先のディレクトリですが、ダウンロードページに気になる記述があります。 WARNING: Tesseract should be either installed in the directory which is suggested during the installation or in a new directory. The uninstaller removes the whole installation directory. If you installed Tesseract in an existing directory, that directory will be removed with all its subdirectories and files. 念の為DeepLで翻訳すると以下です。 警告: Tesseractは、インストール時に指定されたディレクトリにインストールするか、新しいディレクトリにインストールする必要があります。アンインストーラーはインストールディレクトリ全体を削除します。既存のディレクトリにTesseractをインストールした場合、そのディレクトリはすべてのサブディレクトリとファイルとともに削除されます。 危険を避けるためには、新しくtesseractをインストールする用のディレクトリを新規に作成して、そこにインストールするのが無難ですね。 今回はデフォルトのTesseract-OCRを作成してそこに入れる形でいきます。 NextとFinishで完了。 念の為インストールが正しくできているか確認するため、コマンドラインから以下コマンドで確かめてみましょう。 $ tesseract --list-langs うまく行けば以下のように表示されます。 List of available languages (4): eng jpn jpn_vert osd もしエラーがでる場合、環境変数Pathにtesseract.exeの場所が設定されていない可能性があります。確認してみましょう。 2. pytesseractのインストール $ pip install pytesseract だけ。 動かしてみる 試しに、事前にFF14で撮っておいた以下の画像をOCRしてみます。 コードは以下。上記画像を同ディレクトリに置いてOCRにかけ、printしただけです。 import pytesseract from PIL import Image result = pytesseract.image_to_string(Image.open('./ff14marketboard.png'), lang='jpn') print(result) 結果は・・・ NTONY jl) 単品価格 じじ01010】 ECW0100)】 ECW0010】 PA010(0】 EEAOIO10D】 EEAOI00) Sア40010】 (70000) YA)】 70,000ゎ 70,000? 70,.000ゎ EIJI0D】 90,.000? EUROIO(0】 EUROIO(0】 EIJI)】 UP) 105,000ゎ 100,.000ゎ マーケットでの過去の取引履歴 個数 購入者名 1 II!邊DAII(eEI Kikuzone Testarossa な)!N公/人ET) NUMhEIlite| IMEIIMx(ejre) IMliek人lilで| [GIIIEWCEIIIE Astrea Stella EEIUtClnEYo)itelEI Chifuyu Yuki Rituka Uma 貞juEWNEL:II() (6)iE【e|全たいた| Aya Takenoko Nemu Rineko hinteel)【eldnllnntelell tdl【dllい4 MEIMUIGIくII401i| EinEEullnEte) IMに委EIC) BE 7/24 2:43 の21 1 7AE角EE】:) 7/12 0:40 AP4ECF) んザル) 7をた】0妥にが| 74040R0<) 74050くい/ 74じた)?4 74じ引じiP4 74E記CC! 7たに:ECO) 30) の)訓) ルン 40) 5/22 16:23 ロタ4 影作た) 57Aじザル/ 7ん-角MI【) Ca計と! これはひどい。 試しに言語設定をenにして実行してみると。 HISTORY scsi HQ Ban itits 94,000, 94,000> 94,000. 59,000, 59,000> 59,000> 62,000, 67,000, 67,000> 70,0009 70,0009 70,0009 90,000> 90,0009 90,000, 90,000, 90,000> 100,000p 105,000> 100,000> Y—Ty bk COMBOEY | EE (EX HABA 1 Mu Tyuinga Kikuzone Testarossa Abbey Williams Neu Raind Marl Roro Mito Raruka Chris Garua Astrea Stella EFL aviatclamsve)alelic} Chifuyu Yuki Rituka Uma Leona Nakano Ohagi Yaya Aya Takenoko Nemu Rineko Yomogi Mochimochi Melon Mellow Maruten Koikuti Shima Shimao Mine Taro FNS | BSA 7/24 2:43 Wl Wald Ame) 7/12 0:40 7/11 21:43 7/4 3:29 6/30 19:41 6/20 20:06 6/20 0:49 6/14 23:37 6/14 14:17 6/13 5:44 5/31 18:45 By/sl0) 23}53)3) 5/24 21:05 5/22 16:23 EY PA eI) 5/14 3:29 5/8 1:16 4/21 3:34 少しだけマシになりましたが、思ったより精度が出ません。 ゲームのフォントだと特殊なのでしょうか。 類似画像を作って比較してみる Excelを使って、似たような色味、同じ内容、だけど別フォント、の画像を用意してみました。 ※ゲーム中の通貨単位のところだけ、該当する文字がないため、一旦類似の「p」を使ってみました。 この画像に対して同様にOCRにかけるとどうなるでしょうか。 結果は・・・ HISTORY sles HQ anit s 94,000p 94,000p 94,000p 59,000p 59,000p 59,000p 62,000p 67,000p 67,000p 70,000p 70,000p 70,000p 90,000p 90,000p 90,000p 90,000p 90,000p 100,000p sTe}=M010)0) 9) 100,000p (HR ABA 1 Mu Tyuinga 1 Kikuzone Testarossa 1 Abbey Williams 1 Neu Raind 1 Marl Roro 1 Mito Raruka 1 Chris Garua 1 Astrea Stella 1 Bakutteh Songfa 1 Chifuyu Yuki 1 Rituka Uma 1 Leona Nakano 1 Ohagi Yaya WY] <1 10) <o) 1 Nemu Rineko 1 Yomogi Mochimochi 1 Melon Mellow 1 Maruten Koikuti 1 Shima Shimao 1 Mine Taro ERS |B! 7/24 2:43 7/21 1:13 7/15 1:36 7/12 0:40 7/11 21:43 7/4 3:29 6/30 19:41 6/20 20:06 6/20 0:49 6/14 23:37 6/14 14:17 6/13 5:44 5/31 18:45 5/30 23:33 5/24 21:05 5/22 16:23 5/21 2:38 5/14 3:29 5/8 1:16 4/21 3:34 だいぶ正確。元のゲームUIに比べると、Excelで作った類似画像のほうが内容を正しく取得できています。 となると、ゲーム画面のOCRをするには何らかもうひと工夫必要そうですね・・・。 試行錯誤してみようと思います。 参考 文字認識ソフトのTesseractを使ってみた - Qiita おまけ:通貨単位をゲーム中のものにあわせたら 雑コラですが、「p」でごまかさずにゲーム中の通貨単位を使った画像でもやってみました。 HISTORY %le# HQ ots 94,000p 94,0009 94,000p 59,000p 59,000p 59,000p 62,000) 67,000) 67,000 70,000p 70,000) 70,000? 90,000p 90,000? 90,000? 90,000? 90,000p 100,000p 105,000) 100,000p EX FABA 1 Mu Tyuinga 1 Kikuzone Testarossa 1 Abbey Williams 1 Neu Raind lm Fela ce)ge) 1 Mito Raruka 1 Chris Garua 1 Astrea Stella 1 Bakutteh Songfa 1 Chifuyu Yuki 1 Rituka Uma 1 Leona Nakano 1 Ohagi Yaya 1 Aya Takenoko 1 Nemu Rineko aly Co}nnteye im lelel alinalerelay| 1 Melon Mellow 1 Maruten Koikuti 1 Shima Shimao 1 Mine Taro ENS BSH! 0 PA) 7/21 1:13 7/15 1:36 7/12 0:40 7/11 21:43 I LLMCEPAS) 6/30 19:41 6/20 20:06 oy PAO Orbe) 6/14 23:37 6/14 14:17 6/13 5:44 5/31 18:45 5/30 23:33 5/24 21:05 5/22 16:23 5/21 2:38 5/14 3:29 5/8 1:16 4/21 3:34 完全にExcelで作ったもの、に比べると精度が落ちていますが、それでもゲームのスクショそのままよりは正確になっています。通貨単位の文字が特徴的だから全体の精度が落ちている、というわけではなさそうです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

python: 何これ?set operationを使ったらin operatorより爆速だった。

何をしていたか あるデータベースから1,225,793個のウイルスゲノム配列をダウンロードして解析した。数か月たって、再度データをダウンロードしたところ、2,486,361個に増えていた。処理コードはすでに書いてあって、前回解析済みのものはスキップする仕組みになっている。コードのちょっとした手入れの最中に、思いがけない速度改善を得たのでそれについて書きます。 処理コードの概要 ウイルスゲノム配列はfastaファイルとして、また、前回までに解析済みのaccession idは、一行にひとつづつ書きこんだファイルに保存してあり、これらを入力ファイルとして用いる。 コードはこんな感じの作りです。 解析済みaccession idをファイルから読み込んでリスト(known_accessions)に格納する Bio.SeqIOを用いて、fasta fileから順次配列レコードを読み込んでいき、まずaccessionをとる そのaccessionが先のリストになければ次の処理に進む、あれば次のレコードへ "accessionが先のリストになければ"、というところには単純にin operatorを使いました。 if acc not in known_accessions: # do sequence sanity check # re-construct id line # write seq to fasta file ってな具合に。ちなみに、ファイルへの書き出し部分が速度のボトルネックだということに気が付いたので、ひとつづつ書き出すのではなく、ある程度ため込んでから(例えば5000配列)書き出すようにすることで、ずいぶん速度が上がりました。しかし、今日の要点は、そこではないのです。 あれ? 最初に気がついたのは、ファイルへの書き出しをさせない状態でのテストで、known_accessionsに短めの、あるいは空のリストを使うとやたら処理が速くなるということでした。え?もしかしてacc not in known_accessionsの評価で時間がかかっている?さすがにリストの長さが100万を超えると目に見えて影響が出る?ちなみにelementはすべて14文字のstrです。 こうしたら爆速になった たまたま同じ日に、リスト間で共通するelementの抜き出しをしていて、set operationのスピードに感動していた。そこで、in operatorでやっている部分をset operationに変えたらどうなるか、を試してみた。if acc not in known_accessionsの部分に該当するsetを使ったバージョンは以下の通り。 if len(set([acc]) & set(known_accessions)) == 0: # set([acc])は、{acc}でもいいですね # あれこれ 速い!しかも少し、じゃないですよ、めちゃくちゃ速い!実験用コードを書いて、10万のaccessionsをひとつづつ、2,486,361個のelementを含むリスト(setにしていますが)に対して試してみると、0:01:08.563127が0:00:00.445583、興奮してそのまま書いてしまいましたが、1分が0.45秒に! ちなみに1万のaccessionsで試すと0.73秒が0.41秒で、それほどimpressiveには見えませんが、この数の繰り返しでは、コードの最初で行っている、ファイルからのaccessionの読み出しとリストへの格納が実行時間の大半を占めてしまうからだと思われます。 さて、もともとのコードでは7時間11分かかった本番の処理を、set operationでの評価に書き換えたコードで行ってみると、23分47秒で完了しました。たった一行の書き換えで、ここまでかわるなんて。あれこれ試して半日以上つぶれましたが、今後も繰り返す作業なので、もとはすぐに取れます。今後も精進を続けます。 まとめ 次のようなifブロックが繰り返し実行されるコードで、 if a in very_big_list: # do something if a not in very_big_list: # do something if文の評価に時間がかかっているのかも、と思ったら、 if len({a} & set(very_big_list)) > 0: # do something if len({a} & set(very_big_list)) == 0: # do something で改善されるか試してみましょう。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Python演算処理】微分の概念を高校数学段階からグレードアップ?

以下の関数の定義から出発します。 【Python演算処理】冪算と乗除算の関係について。 二つの数の集合X,Yがあって、Xの要素xに対してYの要素yがただ一つ定まる時、この対応を関数(Function)と呼びy=f(x)などと書き表す(fはfunctionの略だが、複数の関数への言及が不可避となる状況ではそれをy=g(x),y=h(x)などと呼び分ける)。 この時xを独立変数(Independent Variable)、yを従属変数(Dependent Variable)と呼ぶ。 また集合Xを関数fの定義域(Domain)、集合Yの部分集合$(y|y=f(x),x \in X)$をこの関数の値域(Range)という。 関数y=fxの変化の様子はxの値を横座標、yの値を縦座標としxを定義域内で変化させた時の点P(x,y)の軌跡を描くと一目瞭然となる。これが関数y=f(x)のグラフである。 正直言って高校までの数学においては微分(Differential)は事実上以下の公式の暗記と再生に過ぎませんでした。 微分公式一覧(基礎から発展まで) | 高校数学の美しい物語 微分計算は素直。積分計算は超エキサイティング。初等関数(三角関数や指数関数など)の四則演算や合成で表現できる関数は,基本的な公式を組み合わせるだけで必ず微分できます(一方,不定積分は必ずしも初等関数で表せるとは限らない)。 基本演算 ①線形性 $(kf(x))'=kf'(x)$(ただしkは定数=スカラー倍の概念に対応) $(af(x)±bg(x))'=af'(x)±bg'(x)$ 高校数学における線形性の8つの例 | 高校数学の美しい物語 別の記法ではこうなる。 \frac{d}{dt}(kX(t))=k\frac{d}{dt}X(t)\\ \frac{d}{dt}(aX(t)±bY(t))=a\frac{d}{dt}X(t)±b\frac{d}{dt}Y(t) ②積の微分: $(fg)'=f'g+fg'$ 積の微分公式とその証明の味わい 【例題】関数$y=f(x)=x^2$と関数$y=g(x)=\sin(x)$の積の微分。 \frac{dy}{dx}x^2=2x\\ \frac{dy}{dx}\sin(x)=\cos(x) よって積の微分公式f'g+fg'に従って f'g+fg'=2x \sin(x)+x^2 \cos(x) pythonによる実装結果 import sympy as sp x,y = sp.symbols('x,y') #原始関数 f=x**2*sp.sin(x) #微分 g=sp.diff(f,x,1) #積分 h=sp.integrate(g,x) #画面表示 sp.init_printing() display(f) print(sp.latex(f)) display(g) print(sp.latex(g)) display(h) print(sp.latex(h)) 原始関数 x^{2} \sin{\left(x \right)} 微分結果 x^{2} \cos{\left(x \right)} + 2 x \sin{\left(x \right)} 積分による復元 x^{2} \sin{\left(x \right)} ③商の微分(分数の微分): $(\frac{g}{f})'=\frac{g'f-f'g}{f^2}$ 商の微分公式の証明と例題​ 【例題】$y=f(x)=\frac{\cos (x)}{\sin (x)}$の微分 \frac{dy}{dx}\cos(x)=-\sin(x)\\ \frac{dy}{dx}\sin(x)=\cos(x)\\ \cos^2(x)+\sin^2(x)=1 よって商の微分公式$\frac{g'f-f'g}{f^2}$に従って y'=\frac{\cos(x)'sin(x)-\sin(x)'\cos(x)}{\sin^2(x)}\\ = \frac{-\sin^2(x)-\cos^2(x)}{\sin^2(x)}\\ = -\frac{1}{\sin^2(x)} pythonによる実装結果 import sympy as sp x,y = sp.symbols('x,y') #原始関数 f=sp.cos(x)/sp.sin(x) #微分 g=sp.diff(f,x,1) #積分 h=sp.integrate(g,x) #画面表示 sp.init_printing() display(f) print(sp.latex(f)) display(g) print(sp.latex(g)) display(h) print(sp.latex(h)) 原始関数 \frac{\cos{\left(x \right)}}{\sin{\left(x \right)}} 微分結果 -1 - \frac{\cos^{2}{\left(x \right)}}{\sin^{2}{\left(x \right)}} 積分による復元 \frac{\cos{\left(x \right)}}{\sin{\left(x \right)}} まぁSympyの癖も分かってきたので、別にこの程度では驚きません。逆をいえば「ここでピタゴラスの定理の導入を確実に思いつく」のが人工知能とも? 特にg=1の時,$(\frac{1}{f})'=-\frac{f'}{f^2}$(逆数の微分) 【例題】$\frac{1}{log(x)}$の微分 \frac{dy}{dx}\log(x)=\frac{1}{x} よって逆数の微分公式$-\frac{f'}{f^2}$に従って y'=-\frac{\log(x)'}{\log(x)^2}=-\frac{1}{x(\log(x)^2} pythonによる実装結果 import sympy as sp x,y = sp.symbols('x,y') #原始関数 f=1/sp.log(x) #微分 g=sp.diff(f,x,1) #積分 h=sp.integrate(g,x) #画面表示 sp.init_printing() display(f) print(sp.latex(f)) display(g) print(sp.latex(g)) display(h) print(sp.latex(h)) 原始関数 \frac{1}{\log{\left(x \right)}} 微分結果 - \frac{1}{x \log{\left(x \right)}^{2}} 積分による復元 \frac{1}{\log{\left(x \right)}} ④合成関数の微分: $(f(g(x))'=f'(g(x))g'(x)$ 合成関数の微分公式と例題7問 別の記法ではこうなる。 y=f(u)がuについて微分可能であり、かつu=g(x)がxについて微分可能であれば、合成関数y=f(g(x))はxについて微分可能であり$\frac{dy}{dx}=\frac{dy}{du}\frac{du}{dx}$と表される。 【例題】関数$y=(5x+3)^2$の微分 y=f(u)=u^2…①\\ u=g(x)=5x+3…② この時、yは以下の形でxの関数となる。 y=f(u)=u^2=(5x+3)^2…③ 逆をいえば$y=(5x+3)^2$の式について$u=5x+3$と置いたのが①②ともいえる。③を展開して項別にxで微分すれば導関数が得られるが、③は①②の合成関数なので以下となる。 \frac{dy}{dx}=\frac{dy}{du}\frac{du}{dx}\\ \frac{dy}{du}u^2=2u\\ \frac{du}{dx}5x+3=5\\ \frac{dy}{du}\frac{du}{dx}=2u*5=10u=10(5x+3)=50x+30 pythonによる実装結果 import sympy as sp x,y = sp.symbols('x,y') #原始関数 f=(5*x+3)**2 #微分 g=sp.diff(f,x,1) #積分 h=sp.integrate(g,x) #画面表示 sp.init_printing() display(f) print(sp.latex(f)) display(g) print(sp.latex(g)) display(h) print(sp.latex(h)) 原始関数 \left(5 x + 3\right)^{2} 微分結果 50 x + 30 積分による復元 25 x^{2} + 30 x 合成微分には積分による復元性に難がある? 【例題】$\cos(ax+b)$の微分 $y=\cos(u),u=ax+b$と置く。 \frac{dy}{dx}\cos(x)=-\sin(x)\\ よって合成関数の微分公式に従い \frac{dy}{dx}=\frac{dy}{du}\frac{du}{dx}\\ \frac{dy}{du}cos(x)=-sin(u)\\ \frac{du}{dx}ax+b=a\\ \frac{dy}{du}\frac{du}{dx}=a(-\sin(u))=-a(\sin(ax+b)) pythonによる実装結果 import sympy as sp x,a,b = sp.symbols('x,a,b') #原始関数 f=sp.cos(a*x+b) #微分 g=sp.diff(f,x,1) #積分 h=sp.integrate(g,x) #画面表示 sp.init_printing() display(f) print(sp.latex(f)) display(g) print(sp.latex(g)) display(h) print(sp.latex(h)) 原始関数 \cos{\left(a x + b \right)} 微分結果 - a \sin{\left(a x + b \right)} 積分による復元 - a \left(\begin{cases} - \frac{\cos{\left(a x + b \right)}}{a} & \text{for}\: a \neq 0 \\x \sin{\left(b \right)} & \text{otherwise} \end{cases}\right) やはり合成微分には積分による復元性に難がある? 【例題】$e^{ax}$の微分 $y=e^u,u=ax$と置く。 \frac{dy}{dx}e^x=e^x\\ よって合成関数の微分公式に従い \frac{dy}{dx}=\frac{dy}{du}\frac{du}{dx}\\ \frac{dy}{du}e^u=-e^u\\ \frac{du}{dx}ax=a\\ \frac{dy}{du}\frac{du}{dx}=a(e^u)=-ae^{ax} pythonによる実装結果 import sympy as sp x,a= sp.symbols('x,a') #原始関数 f=sp.exp(a*x) #微分 g=sp.diff(f,x,1) #積分 h=sp.integrate(g,x) #画面表示 sp.init_printing() display(f) print(sp.latex(f)) display(g) print(sp.latex(g)) display(h) print(sp.latex(h)) 原始関数 e^{a x} 微分結果 a e^{a x} 積分による復元 e^{a x} ⑤(公式ではないが)対数微分法 「両辺>0」を確認して対数を取る(正でないときは絶対値を取る) 両辺を x で微分する y'について解く 対数微分法のやり方と例題 【例題】$y=x^x$の微分。 $y=x^x$の指数の底は正なので,そもそも関数の定義域がx>0xであることに注意する。よって,両辺は正なのでそのまま対数を取れる: \log(y)=xlog(x) 両辺をxで微分する。左辺は前提知識で述べた公式,右辺は積の微分の公式を使う: \frac{y'}{y}=log(x)+1 これを y'について解く: y'=y(\log(x)+1) yをもとに戻す: y'=x^x(\log(x)+1) pythonによる実装結果 import sympy as sp x= sp.symbols('x') #原始関数 f=x**x #微分 g=sp.diff(f,x,1) #積分 h=sp.integrate(g,x) #画面表示 sp.init_printing() display(f) print(sp.latex(f)) display(g) print(sp.latex(g)) display(h) print(sp.latex(h)) 原始関数 x^{x} 微分結果 x^{x} \left(\log{\left(x \right)} + 1\right) 積分による復元 x^{x} Sympy、こういうのはケロっとこなすのでかえってその考え方の重要性を見逃す契機になってしまう? 冪関数の微分 (x^{α})'=αx^{α-1}(αは任意の実数) べき関数(y=x^n)の微分公式の3通りの証明 例えば$(x^2)'=2x,(x^{10})'=9x^9$ 【数理考古学】冪乗算の微積分 対応する以下の積分公式がα-1の時に使えない。 \int x^α dx=\frac{1}{α+1}x^{α+1}+C(α \in \mathbb{R} \land α \neq -1) それで以下の式で代用する事が多い。 (α^x)'=α^x \log(α)\\ \int α^x dx = \frac{α^x}{\log(α)} α=−1とすると$(\frac{1}{x})'=-\frac{1}{x^2}$ pythonによる実装結果 import sympy as sp x= sp.symbols('x') #原始関数 f=1/x #微分 g=sp.diff(f,x,1) g2=sp.diff(f,x,2) #積分 h=sp.integrate(g,x) #画面表示 sp.init_printing() display(f) print(sp.latex(f)) display(g) print(sp.latex(g)) display(h) print(sp.latex(h)) display(g2) print(sp.latex(g2)) 原始関数 \frac{1}{x} 微分結果 - \frac{1}{x^{2}} 積分による復元 \frac{1}{x} 二階微分だと負号が消える \frac{2}{x^{3}} α=$\frac{1}{2}$とすると$(\sqrt{x})'=\frac{1}{2\sqrt{x}}$ pythonによる実装結果 import sympy as sp x= sp.symbols('x') #原始関数 f=sp.sqrt(x) #微分 g=sp.diff(f,x,1) #積分 h=sp.integrate(g,x) #画面表示 sp.init_printing() display(f) print(sp.latex(f)) display(g) print(sp.latex(g)) display(h) print(sp.latex(h)) 原始関数 \sqrt{x} 微分結果 \frac{1}{2 \sqrt{x}} 積分による復元 \sqrt{x} 【Pyrhon演算処理】同心集合①乗法的同心集合とは? この演算は「同心円集合$r^{\frac{1}{2}}$に内接/外接する正方形集合」と縁深い事で知られている。 ​指数対数関数の微分 微積分演算に対応しない形で以下の観測結果集合を構成する。 【初心者向け】指数・対数関数の発見とそれ以降の発展について。 自然指数関数 自然対数関数 0 y=exp(x) y=log(x) 1 y=exp(-x) y=log(-x) 2 y=-exp(x) y=-log(x) 3 y=-exp(-x) y=-log(-x) $(e^x)'=e^x$…積分の結果も$\int e^x dx = e^x$となる。 $(e^{ax})'=ae^{ax}$…積分の結果は$\int e^{ax} dx = \frac{1}{a}e^{ax}$となる。 $(\log(x))'=\frac{1}{x}$…これに対応する積分の結果は$\int \frac{1}{x} dx = \log(x)$となる。 $(\log_{a}(x))'=\frac{1}{x \log(a)}$…一般の対数関数の場合。 $(α^x)'=α^x \log(α)$…用例は上掲。【数理考古学】冪乗算の微積分 これに関連して \int \log(x) dx = x(log(x)-1)+C pythonによる実装結果 import sympy as sp x,a= sp.symbols('x,a') #原始関数 f=sp.log(x) #微分 g=sp.integrate(f,x) #積分 h=sp.diff(g,x,1) #画面表示 sp.init_printing() display(f) print(sp.latex(f)) display(g) print(sp.latex(g)) display(h) print(sp.latex(h)) 原始関数 \log{\left(x \right)} 積分結果 x \log{\left(x \right)} - x 微分による復元 \log{\left(x \right)} そして虚冪演算の微積分は回転を通じて三角関数に関連付けられます。 【Python演算処理】冪算と乗除算の関係について。 $e^{ix}\frac{d^n}{dθ^n}=(i e^{i x}(-\log ix),-e^{ix},-i e^{i x}(\log ix),e^{ix},…)$ $\int \int \int … \int e^{ix}(dθ)=(- i e^{i x}(\log ix),- e^{i x},i e^{i x}(-\log ix),e^{ix},…)$ さてドン尻に控えしは… $(\log(x+\sqrt{x^2+a}))'=\frac{1}{\sqrt{x^2+a}}$…何に用いられる式か不明だが、大学受験の出題範囲に入っているっぽくてネットに解答例が頻出。 pythonによる実装結果 import sympy as sp x,a= sp.symbols('x,a') #原始関数 f=sp.log(x+sp.sqrt(x**2+a)) #微分 g=sp.diff(f,x,1) #積分 h=sp.integrate(g,x) #画面表示 sp.init_printing() display(f) print(sp.latex(f)) display(g) print(sp.latex(g)) display(h) print(sp.latex(h)) 原始関数 \log{\left(x + \sqrt{a + x^{2}} \right)} 微分結果 \frac{\frac{x}{\sqrt{a + x^{2}}} + 1}{x + \sqrt{a + x^{2}}} 積分による復元 \log{\left(x + \sqrt{a + x^{2}} \right)} Sympy完全に猫跨ぎ…微塵のモチベーションも感じられません。この猫っぽい仕草が本当に愛らしいのですよ。 三角関数の微分 【Python演算処理】冪算と乗除算の関係について。 三角関数の微分(それぞれが+90度の変遷に対応) \cos(θ)\frac{d^n}{dθ^n}=(-\sin(θ),-\cos(θ),\sin(θ),\cos(θ),…)\\ \sin(θ)\frac{d^n}{dθ^n}=(\cos(θ),-\sin(θ),-\cos(θ),\sin(θ),…) 三角関数の積分(それぞれが-90度の変遷に対応) \int \int \int … \int \cos(θ)(dθ)=(\sin(θ),-\cos(θ),-\sin(θ),\cos(θ),…)\\ \int \int \int … \int \sin(θ)(dθ)=(-\cos(θ),-\sin(θ),\cos(θ),\sin(θ),…) 【Python演算処理】等速円運動についての物理学と数学の立場の違い? $\cos(θ)=\frac{e^{θi}+e^{-θi}}{2}$ $\sin(θ)=\frac{e^{θi}-e^{-θi}}{2i}$ tanxと1/tanxの微分公式のいろいろな証明 $(\tan x)'=\frac{1}{\cos^2(x)}$…タンジェントの微分結果 pythonによる実装結果 import sympy as sp x,a= sp.symbols('x,a') #原始関数 f=sp.tan(x) #微分 g=sp.diff(f,x,1) #積分 h=sp.integrate(g,x) #画面表示 sp.init_printing() display(f) print(sp.latex(f)) display(g) print(sp.latex(g)) display(h) print(sp.latex(h)) 原始関数 \tan{\left(x \right)} 微分結果 \tan^{2}{\left(x \right)} + 1 積分による復元 \frac{\sin{\left(x \right)}}{\cos{\left(x \right)}} Sympy「にゃー(タンジェントなんてオワコン)」圧を感じます。 ​ * $(\cot x)'=(\frac{1}{\tan(x)})'=-\frac{1}{\sin^2(x)}$…コタンジェント(タンジェントの逆数)の微分結果 pythonによる実装結果 import sympy as sp x,a= sp.symbols('x,a') #原始関数 f=sp.cot(x) #微分 g=sp.diff(f,x,1) #積分 h=sp.integrate(g,x) #画面表示 sp.init_printing() display(f) print(sp.latex(f)) display(g) print(sp.latex(g)) display(h) print(sp.latex(h)) 原始関数 \cot{\left(x \right)} 微分結果 - \cot^{2}{\left(x \right)} - 1 積分による復元 \frac{\cos{\left(x \right)}}{\sin{\left(x \right)}} Sympy「にゃー(コタンジェントなんてオワコン)」圧を感じます。 三角関数 - Wikipedia 三角関数のグラフ: Sine(青実線)、 Cosine(緑実線)、 Tangent(赤実線)、 Cosecant(青点線)、 Secant(緑点線)、 Cotangent(赤点線) 逆三角関数の重要な性質まとめ $(\mathrm{Arcsin}(x))′=\frac{1}{\sqrt{1-x^2}}$ pythonによる実装結果 import sympy as sp x,a= sp.symbols('x,a') #原始関数 f=sp.asin(x) #微分 g=sp.diff(f,x,1) #積分 h=sp.integrate(g,x) #画面表示 sp.init_printing() display(f) print(sp.latex(f)) display(g) print(sp.latex(g)) display(h) print(sp.latex(h)) 原始関数 \operatorname{asin}{\left(x \right)} 微分結果 \frac{1}{\sqrt{1 - x^{2}}} 積分による復元 \operatorname{asin}{\left(x \right)} $(\mathrm{Arccos}(x))'=-\frac{1}{\sqrt{1-x^2}}$ pythonによる実装結果 import sympy as sp x,a= sp.symbols('x,a') #原始関数 f=sp.acos(x) #微分 g=sp.diff(f,x,1) #積分 h=sp.integrate(g,x) #画面表示 sp.init_printing() display(f) print(sp.latex(f)) display(g) print(sp.latex(g)) display(h) print(sp.latex(h)) 原始関数 \operatorname{acos}{\left(x \right)} 微分結果 - \frac{1}{\sqrt{1 - x^{2}}} 積分による復元 \operatorname{acos}{\left(x \right)} $(\mathrm{Arctan}(x))'=\frac{1}{1+x^2}$ pythonによる実装結果 import sympy as sp x,a= sp.symbols('x,a') #原始関数 f=sp.atan(x) #微分 g=sp.diff(f,x,1) #積分 h=sp.integrate(g,x) #画面表示 sp.init_printing() display(f) print(sp.latex(f)) display(g) print(sp.latex(g)) display(h) print(sp.latex(h)) 原始関数 \operatorname{atan}{\left(x \right)} 微分結果 \frac{1}{x^{2} + 1} 積分による復元 \operatorname{atan}{\left(x \right)} $(\mathrm{Arccot}(x))'=-\frac{1}{1+x^2}$ pythonによる実装結果 import sympy as sp x,a= sp.symbols('x,a') #原始関数 f=sp.acot(x) #微分 g=sp.diff(f,x,1) #積分 h=sp.integrate(g,x) #画面表示 sp.init_printing() display(f) print(sp.latex(f)) display(g) print(sp.latex(g)) display(h) print(sp.latex(h)) 原始関数 \operatorname{acot}{\left(x \right)} 微分結果 -\frac{1}{x^{2} + 1} 積分による復元 \operatorname{acot}{\left(x \right)} 逆三角関数 - Wikipedia 平面上の直交座標系で図示されたarcsin(x)(赤)と arccos(x)(青)の通常の定義における主値。 平面上の直交座標系で図示されたarctan(x)(赤)と arccot(x) (青)の通常の定義における主値。 双曲線関数にまつわる重要な公式まとめ $(\sinh(x))'=\cosh(x)$ pythonによる実装結果 import sympy as sp x,a= sp.symbols('x,a') #原始関数 f=sp.sinh(x) #微分 g=sp.diff(f,x,1) #積分 h=sp.integrate(g,x) #画面表示 sp.init_printing() display(f) print(sp.latex(f)) display(g) print(sp.latex(g)) display(h) print(sp.latex(h)) 原始関数 \sinh{\left(x \right)} 微分結果 \cosh{\left(x \right)} 積分による復元 \sinh{\left(x \right)} $(\cosh x)'=\sinh(x)$ pythonによる実装結果 import sympy as sp x,a= sp.symbols('x,a') #原始関数 f=sp.cosh(x) #微分 g=sp.diff(f,x,1) #積分 h=sp.integrate(g,x) #画面表示 sp.init_printing() display(f) print(sp.latex(f)) display(g) print(sp.latex(g)) display(h) print(sp.latex(h)) 原始関数 \cosh{\left(x \right)} 微分結果 \sinh{\left(x \right)} 積分による復元 \cosh{\left(x \right)} $(\tanh x)'=1-\tanh^2(x)$ pythonによる実装結果 import sympy as sp x,a= sp.symbols('x,a') #原始関数 f=sp.tanh(x) #微分 g=sp.diff(f,x,1) #積分 h=sp.integrate(g,x) #画面表示 sp.init_printing() display(f) print(sp.latex(f)) display(g) print(sp.latex(g)) display(h) print(sp.latex(h)) 原始関数 \tanh{\left(x \right)} 微分結果 1 - \tanh^{2}{\left(x \right)} 積分による復元 \tanh{\left(x \right)} 双曲線関数 - Wikipedia そして受験数学ではほとんど黙殺されているに等しいこの双曲線関数こそが機械学習概念の発端となったシグモイド曲線へとつながっていくのです。 【Python演算処理】冪算と乗除算の関係について。 {{\displaystyle \varsigma _{a}(x)={\frac {1}{1+e^{-ax}}}={\frac {\tanh(ax/2)+1}{2}}} } 円と球を巡る微積分 【Python演算処理】半径・直径・円周長・円の面積・球の表面積・球の体積の計算上の往復 【Python演算処理】「N次球概念導入による円/球関係の数理の統合」? 円の面積$πr^2$$を半径rで微分すると円周の長さ2πrとなる。逆に円周の長さ2πrを半径rで積分すると円の面積$πr^2$になる。 球の体積$4/3πr^3$を半径rで微分すると球の表面積$4πr^2$、逆に球の表面積$4πr^2$を半径rで積分すると球の体積$4/3πr^3$となる。 球の表面積$4πr^2$を半径rで微分すると円周長2πr、逆に円周長2πrを半径rで積分すると球の表面積$4πr^2$となる。 どうして微積分可能範囲がこんな形で「離散的」に現れるのか。それを説明するには階乗の概念を複素数全体に拡張したΓ関数の導入を必要不可欠とする。要するにこれらはそれぞれ構造全体を説明する巨大な単一方程式の部分抽出に過ぎないのである。 これで概ね大学受験数学までに習う微分の範囲は網羅した? とはいえ、これらの知識を総動員したとしても「微分とは何か」自体はまるで見えてきません。それを理解するにはまた別のアプローチが必要となる様なのです。 微分とは何か?(理論編) 涌井良幸「高校生からわかるフーリエ解析(2019年)」 関数y=f(x)の定義域(x)内の点αにおいて$Δx \to 0$の時、$\frac{f(α+Δx)-f(α)}{Δx}$が一定の値に収束する時「関数y=f(x)はx=αで微分可能である」とし、この一定の値をx=aにおける微分係数と呼びf'(α)で表す。 f'(a)=\lim_{Δx \to 0}\frac{f(α+Δx)-f(α)}{Δx} Δx→0はΔx>0から0に近づけても、Δx<0から0に近づけても、また正負を交互に変化させつつ0に近づけても良い。いずれにせよα+Δxの数直線上の絶対値がαに漸近する事が重要なのである。 関数f(x)がx=aの十分近くで定義されている時、Δy=f(a+Δx)-f(a)だとすると$\frac{Δy}{Δx}=\frac{f(a+Δx)-f(a)}{Δx}$は関数f(x)上の2点a,bを通る直線lの傾きを表す。すなわち「x=αで微分可能である」という事は、点a,bを限りなく近づけた時直線lの傾きが一定に近づく一点が存在する事を意味する。すなわち点A(a,f(a))(あるいは点B(b,f(b)))付近のグラフが滑らかで連続しておりドンドン拡大していくと直線とみなせる状態に到達する、すなわち「拡大して直線と見做せた時に微分可能と見做され、その時の直線の傾きが微分係数となる」のである。 \lim_{Δx \to 0}\frac{Δy}{Δx}=\lim_{Δx \to 0}\frac{f(α+Δx)-f(α)}{Δx} ここで導入された「十分に近い」概念はおそらく抽象数学における「近傍(Neighbourhood)」概念と密接に関係している。近傍とは - コトバンク ここで集合x=(a,b,c,…)にその微分係数(f'(a),f'(b),f'(c),…)を対応させる関数f'(x)を考え、原始関数(Primitive Function)f(x)の導関数(Derivative Function)と呼ぶ事にする。 f'(x)=\lim_{Δx \to 0}\frac{Δy}{Δx}=\lim_{Δx \to 0}\frac{f(x+Δx)-f(x)}{Δx} 導関数の記号は$y',\frac{dy}{dx},\frac{dy}{dx}f(x)$などでも良い。いずれにせよ関数f(x)の導関数を求める事を「微分する」と呼ぶ。 何だか分かるような分からない様な抽象的な定義ですね。しかしまぁ、ある意味それこそが厳密さを極めた現代数学の特徴とも? そして… 高校数学からヤコビアンに至るまで 「合成関数の微分」概念は最小単位Δを共有する「チェーンメール変換」イメージを経て偏微分方程式の各変数を関数とする多重積分に拡張される。 さらにここでいう共通最小単位Δの定義がイプシロンデルタ論法によって拡張される。 こうして強化された共通最小単位Δの概念を直交座標と極座標の変換に導入した結果がヤコビアン行列となる。 大雑把にいうとこうした考え方が大学で習う「専門数学」の領域に入ってくる様です。まだまだ全体像は掴めないままですが、何となく道筋は掴めてきた感じがします。 これまでの投稿で述べてきた 「同心集合(Concentric Set)=中心0の1点でのみ固定された数直線上に置かれたそれぞれの値が描く同心円/同心球面t」概念自体がここに登場しないのは、「空間全体を構成する偏微分方程式を各変数ごとの多重積分に変換する過程」においては、まず半径r=スカラー量を抽出し、しかるのちに一次トーラス=半径1の単位円(円周長2π)の直積によって全体を把握していくのが直交座標(r(スカラー量),φ(-π~+π),θ(-π~+π),…)の流儀だから。 もちろんこの考え方だけでは「メルカトル座標系(φ=-π~+π,θ=0~π)と二次元トーラス座標系(φ=-π~+π,θ=-π~+π)」「ヤコビアン座標系(r=0~1,φ=-π~+π,θ=0~π)と三次元トーラス(四元数)座標系(i,j,kそれぞれが-1~+1の稼働範囲)」それぞれのメリットとデメリットが上手く説明出来ず、これからの克服課題として急浮上してくる。 現時点での自認は大体こんな感じ? 微分とは何か?(実践編) 【初心者向け】自然指数関数と自然対数関数の交点について。 導関数がX軸とY軸の間に間に作る面積は原始関数の値と一致する。 改めて具体的に「微分とは何か?」再掌握するには、この辺りが鍵となってくる様です。 一次方程式y=x y=x\\ y'=1 導関数の導出過程 f'(x)=\lim_{Δx \to 0}\frac{Δy}{Δx}=\lim_{Δx \to 0}\frac{f(x+Δx)-f(x)}{Δx}\\ =\lim_{Δx \to 0}\frac{(x+Δx)-x}{Δx}=\lim_{Δx \to 0}\frac{Δx}{Δx}=1 x=4の時、原始関数y=x→y=4、導関数y=1→y=1×4=4 二次方程式y=x^2 y=\frac{1}{2}x^2 \\ y'=x 導関数の導出過程 f'(x)=\lim_{Δx \to 0}\frac{Δy}{Δx}=\lim_{Δx \to 0}\frac{f(x+Δx)-f(x)}{Δx}\\ =\lim_{Δx \to 0}\frac{(x+Δx)^2-x^2}{Δx}\\ =\lim_{Δx \to 0}\frac{(x^2+2xΔx+Δx^2)-x^2}{Δx}\\ =\lim_{Δx \to 0}\frac{2xΔx+Δx^2}{Δx}\\ =\lim_{Δx \to 0}2x+Δx=2x 原関数がx=4(y=8)の時、導関数は$\frac{4×4}{2}=8$ これは物理学の基礎に対応しています。 落下運動 運動エネルギーの基本式 自由落下運動(Free Fall Movement)とは以下の様な運動を指す。 ①重力加速度0.98(=:1,単位m/s^2)の力のかかる向きが進行方向と完全に一致する。 ②初速0(m/s)で時間t=0(s)の時の位置y=0(m)とする。 この時、 ①時間t=x(s)時点の速度v=gt(m/s)となる。 ②時間t=x(s)時点の位置y=1/2×gt^2(m)となる。 ③1/2なる数字は(三角形の面積(h(高さ)+v(幅))/2を求める要領で)時間t=0時点の速度v=0(m/s)から時間x(s)時点までの速度v=gt(m/s)までの平均速度(m/s)を求める過程で現れる。 従ってv^2=2gyが成立。 ここで重力係数0.98を1に単純化すると見慣れた微分式$y=x^2→y=2x$の式が現れる訳ですね。そこでは単位m/sが面積に対応します。 速度s(m/s)=時間t(s)×重力係数g(m) 初速$v_0=0(m/s)$から時間t時点の速度$v_t=gt(m/s)$の平均速度vは$\frac{gt}{2}(m/s)$となる。さらにg=1と置くと$\frac{t}{2}(m/s)$となる。 x(時間t)時点の位置y(m)は平均速度v(m/s)×時間t(s)=$\frac{gt^2}{2}(m)$となる。 さらにg=1と置くと$\frac{t^2}{2}(m)$となる。 従って重力加速度=1と置くと$x^2(t)=2y(m)$となる。 さらにいうと、ここで重力係数$g(0.98) \fallingdotseq 1$と置く事は、それを実数環(Real Ring)すなわち実数列(Real Sequence)を垂直軸()z、半径1の単位円を水平軸()xyに取った円筒座標系()へと射影(Projection)する事を意味します。そうすると嬉しい事にz軸(実数列)の値がそのまま勾配($\frac{z}{1}$)に対応する展開を迎える訳ですね。 三次方程式y=x^3 y=\frac{1}{3}x^3 \\ y'=x^2 導関数の導出過程 f'(x)=\lim_{Δx \to 0}\frac{Δy}{Δx}=\lim_{Δx \to 0}\frac{f(x+Δx)-f(x)}{Δx}\\ =\lim_{Δx \to 0}\frac{(x+Δx)^3-x^3}{Δx}\\ =\lim_{Δx \to 0}\frac{(x^3+3x^2Δx+3xΔx^2+Δx^3)-x^3}{Δx}\\ =\lim_{Δx \to 0}\frac{3x^2Δx+3xΔx^2+Δx^3}{Δx}\\ =\lim_{Δx \to 0}3x^2+3xΔx+Δx^2\\ =3x^2+3*0+0^2=3x^2 未知の領域なので、とっさに考えがまとまりません。とりあえず、以下続報…
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

⚡⚡PythonとHoraを使用して、非常に高速な顔認識システムを作成します⚡⚡

CVは人工知能の頂点であり、顔認識はその広範なアプリケーションとして、日常生活のあらゆる側面に登場しています。 今日、私たちはPythonとhoraを使用して顔認識アプリケーションを作成しています 1. dependencyをダウンロードします pip install -U flask numpy face_recognition Pillow horapy 2. 既存の顔datasetを埋め込む必要があります ここで、デモの顔データベースは dataset であり、face_recognitionを使用して埋め込み、その最下層は微調整された model です。 その中で、顔認識アプリケーションのコアであるhora.HNSWIndexを初期化し、誇張された速度で隣人を検索して、最も一致する顔写真を見つけます。 # -*- coding: utf-8 -*- import numpy as np from horapy import HNSWIndex import face_recognition from os import listdir from os.path import isfile, join from flask import Flask, request, abort, jsonify from PIL import Image image2vector = dict() # image to vector map f = 128 # vector dimension index = HNSWIndex(f, "str") # init Hora index instance app = Flask(__name__) # wep app instance def img2vector(): # encode all image into vector face_image_path = "" # here write you image file path images = [f for f in listdir(face_image_path) if isfile(join(face_image_path, f))] for f in images: image = face_recognition.load_image_file(face_image_path + "/" + f) embedding = face_recognition.face_encodings(image) if embedding and len(embedding) > 0: image2vector[f] = embedding[0] index.add(embedding[0], f) index.build("euclidean") 3. web application このようにして、基本データがロードされ、残りはindexを提供するだけで済みます。 今回は、比較的 flask で明確なフラスコをWeb applicationのframeworkとして選択しました。 @app.route("/match", methods=['GET']) def image_match(): # image match main function image = request.args.get('image', '') # get request image query if image not in image2vector: # if thers is not image in the map, return 404 abort(404) response = list() for similar_image_idx in index.search(image2vector[image], 10): response.append({ "image": similar_image_idx, "image_embedding": image2vector[similar_image_idx].tolist() }) return jsonify(response) @app.route("/search", methods=['POST']) def image_search(): img = Image.open(request.files['file'].stream) # get request image query image = np.array(img) embedding = face_recognition.face_encodings(image) # encode incomming image into vector response = list() for similar_image_idx in index.search(embedding, 10): response.append({ "image": similar_image_idx, "image_embedding": image2vector[similar_image_idx].tolist() }) return jsonify(response) if __name__ == "__main__": img2vector() app.run(debug=True) 今、私たちはbashに入ります python app.py 私たちの顔認識アプリケーションが稼働しています terminal で入力できます curl http://localhost:5000/match\?image\={your image} 見ることができます [ {{ {{ "image": "123.jpg"、 "image_encoding":[ ..。 ] }、 {{ "image": "124.jpg"、 "image_encoding":[ ..。 ] }、 {{ "image": "125.jpg"、 "image_encoding":[ ..。 ] } } ] これで顔認識アプリケーションが完成しました 詳細については、Hora をクリックしてください。 github: https://github.com/hora-search/hora Python Library: https://github.com/hora-search/horapy homepage: https://horasearch.com/
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Python初心者がTwitterAPIを使ってつぶやいてみた。(2021年7月の情報)

著者の実行環境 OSはWindows10、Pythonのバージョンは3.7.8となっています。VS CodeでPythonを実行しています。 初心者ではありますが、環境構築は済んでいるのでスキップさせていただきます。 はじめに 著者は初心者なので、なるべく正確な情報を記述するように心がけていますが、情報に誤りがあるかもしれません。あらかじめご了承ください。 コードを書く前に準備! TwitterAPIへのアクセス権限の取得 アクセス権限を得るために、自分のTwitterアカウントをデベロッパーアカウントに昇格させましょう。 (Twitterアカウントにメールアドレスと電話番号を紐づける必要があります) 以下のサイトにアクセスします。 https://developer.twitter.com/en/apply-for-access "Apply for a developer account"をクリックします。 はじめに、"Professional"(プロ) "Hobbyist"(趣味でやる人) "Academic"(勉強のために使う人)の3択があるので、自分に合うものを選んでください。 次に、"Making a bot"(ボットを作る) "Building tools for Twitter users"(ツイッターユーザーのためのツールを作る) "Exploring the API"(APIを探求する)の3択があるので、自分の目的に近いものを選んでください。 上から順に説明します。 "What would you like us to call you?" → 呼び名を入力してください。 "What country do you live in?" → 居住国を入力してください。 "What's your current coding skill level?" → 現段階のプログラミングレベルを入力してください。 未経験なら"No experience" ちょっとなら"Some experience" ゴリゴリあるなら"Highly experienced" を選びましょう。 ここからが一番大変なのですが、がんばりましょう。 "How will use the Twitter API or Twitter Data?"(TwitterのAPIとデータをどのように使いますか?) という質問に対する返答を200字以上の英語で回答しましょう。 I would like to ~ を使って大雑把なAPIの利用目的を記述し、For exampleを使って具体的な利用方法を記述すると、頑張れば200字は埋められます。(2行くらいで200字になります) Twitterのデータも分析してみたいという人はYesにし、どのようにTwitterのデータを活用するか100字以上で記述しましょう。 ツイート機能を利用したいので、Yesにします。どのようにツイート、リツイート、ライク、フォロー、DM機能を利用するか、100字以上の英語で書きましょう。 集計したデータをTwitter以外の場で開示したい場合はYesにしましょう。どこで、どのように開示するか記述しましょう。 TwitterAPIを用いて作ったプログラムを政府機関(教育機関は除く)も利用可能にする場合、Yesにします。(ほとんどの人の場合該当しません) (スクショの画像ではYesになっていますが、スクショ後Noにして申請しました) 規約書を読み、チェックボックスをクリックして同意します。 このような画面が表示され、認証メールが送られますので、メールボックスをチェックしましょう。 このようなメールが届いているはずです。Confirm your emailをクリックしましょう。これで 開発者アカウントに昇格完了です!以下のサイトにアクセスしましょう。 https://developer.twitter.com/en/portal/dashboard Create Projectをクリックします。 プロジェクト名を決めて入力しましょう。(何でもいい) 使う目的を選択します。今回は"Exporing the API"でいきます。 プロジェクトの概要を記述しましょう。著者は"Tweet something using Twitter API."にしました。 アプリ名を決めて入力しましょう。 API Key、API Secret Key、Bearer Tokenを取得できました。これらの情報を見れるのは最初で最後なので、Windowsのメモ帳にメモするのをお勧めします。(情報をなくしたとしても、再生成はできる)(メモ内容は見られないように管理する) アプリの権限を変更してツイッターのデータに書き込んだり、DMできるようにしましょう。"Edit"をクリックします。 Read+Write+Direct Messagesを選択して、Saveをクリックします。 Keys and tokensの項目にジャンプしましょう。 Access Token and SecretをGenerateしましょう。 これらもメモ帳にコピペしておきます。 これでTwitter側での操作は完了です。 tweepyライブラリのインストール 著者はコマンドプロントにてインストールをしました。(Anacondaを利用している場合のインストール方法はわからないのでご了承ください。) コードを書く! import tweepy API_KEY = "******************" API_SECRET = "*****************" ACCESS_TOKEN = "******************" ACCESS_TOKEN_SECRET = "*****************" auth = tweepy.OAuthHandler(API_KEY, API_SECRET) auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET) api = tweepy.API(auth) api.update_status("テスト") API Keyなどは先ほどメモしたものを入力すればオッケーです。 api.update_statusの引数がツイート内容となっています。 無事投稿できました! tweets = api.search(q='"#python"', lang='ja', result_type='recent',count=5) for tweet in tweets: print (tweet) 上のコードを実行するとツイート情報を取得できます。 q=検索キーワード、lang=言語、result_type=取得するツイートの種類、count=ツイートの取得数となっています。 result_typeにはpopular(人気のツイート)、recent(最新のツイート)、mixed(すべてのツイート)の3種類があるみたいです。 参考サイト https://dividable.net/programming/python/python-twitter-api-get-followers-count https://qiita.com/soma_sekimoto/items/6b9f32552f4ab50be452 https://syncer.jp/Web/API/Twitter/REST_API/GET/search/tweets/
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

OpenCV・PIL・PyTorchの画像要素の順番と3次元配列のイメージの違い

結論から言うと、画像要素はそれぞれこのような順番の違いがある OpenCV: [高さ、幅、色チャネル] PIL: [高さ、幅、色チャネル] PyTorch: [色チャネル、高さ、幅] 故に、PyTorchでは必ず img_transformed = img_transformed.numpy().transpose((1, 2, 0)) のように要素を入れ替える必要があるので注意 通常のnumpy3次元配列とOpenCVやPILの3次元配列のイメージの違い 通常のnumpy3次元配列はこのようなイメージだと思う 通常のnumpy3次元配列 X = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]], [[13, 14, 15]], [16, 17, 18]]]) 要素の取り出し # 最初の数字が三次元目の軸(奥行き方向)、2番目が二次元目の軸(縦)、3番目が一次元目(横) >>> X[0, 1, 2] 6 # 奥行き軸(axis=0)の0番目を取り出す >>> X[0, :, :] array([[1, 2, 3], [4, 5, 6]]) # 縦軸(axis=1)の1番目を取り出す >>> X[:, 1, :] array([[ 4, 5, 6], [10, 11, 12]]) # 横軸(axis=2)の2番目を取り出す >>> X[:, :, 2] array([[ 3, 6], [ 9, 12]]) [奥行き=RGBチャネル, 高さ, 幅] の順なのでOpenCVやPILで読み込んだ画像をPyTorchに変換するとこのイメージと同じになる しかしその前に一般的に画像処理に使われるライブラリOpenCV, PILでは同じ3次元ではあるのだが、配列構成のイメージが違う OpenCV, PILの3次元配列 OpenCVやPILなどは、 [高さ, 幅、奥行き=RGBチャネル] の順になる(OpenCVはBGRの順なので注意) import cv2 img = cv2.imread('img.png') print(img.shape) > (172, 180, 3) print(img) > [[[ 58 35 33] [ 57 33 30] [ 54 29 25] ... [ 7 6 8] [ 8 8 9] [ 10 10 11]] [[ 60 36 34] [ 60 34 31] [ 56 30 26] ... [ 6 6 8] [ 8 7 9] [ 10 9 10]] [[ 61 37 34] [ 62 36 32] [ 60 33 29] ... [ 6 5 7] [ 7 7 8] [ 9 9 10]] 要素の取り出し # 行(高さ)を取得 print(img[0, :, :].shape) print(img[0, :, :]) > (180, 3) [[58 35 33] [57 33 30] [54 29 25] ... [ 8 8 9] [10 10 11]] # 列(幅)を取得 print(img[:, 0, :].shape) print(img[:, 0, :]) > (172, 3) [[ 58 35 33] [ 60 36 34] [ 61 37 34] [ 62 36 34] ... [139 89 69] [121 72 53]] # 奥行き(チャネル)を取得 print(img[:, :, 0].shape) print(img[:, :, 0]) > (172, 180) [[ 58 57 54 ... 7 8 10] [ 60 60 56 ... 6 8 10] [ 61 62 60 ... 6 7 9] ... [157 154 144 ... 20 23 24] [139 134 124 ... 22 24 25] [121 116 107 ... 22 23 25]] [高さ, 幅, 奥行き=RGBチャンル] の順なので次元ごとの要素の取り出し方が通常のnumpy及びPyTorchとは異なることに注意 高さと幅のイメージが直感的に異なるが実態はこうなっている。 なぜこうなっているかだが、テレビのディスプレイなどでは、1画素の中でRGBの光の混色で色を表す仕組みであるため配列の横軸方向に色チャネルを並べ、次点で高さ、幅という順番の3次元配列になったのだと思われる。 補足: ※ 操作時には、最も外側の次元から順に取り出していくと覚えると良い。 参考
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

右クリックからWinPythonのCommand Promptを開けるようにする方法

記事の目的 Python開発環境WinPythonが導入されたPCにおいて、エクスプローラ上で右クリックした場所でWinPython環境が有効化されたコマンドプロンプトが開けるようにする。 前提条件 導入環境 導入先PCの想定環境を整理する。 - OSはWindows10であること - WinPythonがインストールされていること  (WinPythonについては後述する。なお筆者はWPy64-3860をインストールした) - PCに管理者権限が付与されていること(サラリーマンの方は気にするところのはず) WinPythonとは WinPythonとは、オープンソースで商用利用可能な科学技術系Pythonディストリビューションの一つである。今もっとも有名なディストリビューションであるAnacondaが近年大企業に対して商用利用有料化に舵を切りはじめたことに対応するにあたって、WinPythonは移行先として最有力な開発環境である(と筆者は思っている)。 導入は以下の公式サイトから Winpython64-X.X.X.X.exe(Xはバージョン)をダウンロードして 好みの場所(例えばC直下)などでダブルクリックして展開すればとりあえずOK。(詳細はまた別の記事にします) WinPythonのコマンドプロンプトの従来の使い方 WinPythonのコマンドプロンプトとは、Python関係へのパスがロード済みのコマンドプロンプトを指す。たとえば「WinPython Command Prompt.exe」を実行することで開く。ここから、例えば「ipython」などのPythonコマンドが実行可能である。 自分の作業したいディレクトリに移動するには、ここから「cd XXXX」(XXXXは移動先のパス)などを実行する必要があった。これが地味にひと手間。 【本題】右クリックにWinPythonコマンドプロンプトを追加する 実施前の注意 レジストリを修正することになるので操作は慎重に行うこと。 設定方法 レジストリエディタを開く。 「コンピューター\HKEY_CLASSES_ROOT\Directory\Background\shell」の中に、新しいキーを追加して(「shell」を右クリックから)、名前を「winpythonPrompt」などに変更する。 左窓のいま作った「winpythonPrompt」を選択して右窓の「(限定)」値をダブルクリックして、値を「WinpythonPromptをここで開く」などとする。 左窓の「winpythonPrompt」を右クリックしてさらにキーを追加し、名前を「command」とする。 左窓のいま作った「command」を選択して右窓の「(限定)」値をダブルクリックして、値を「cmd.exe /K C:\WPy64-3860\scripts\env_for_icons.bat」とする。(WinPythonをC直下にインストールしていない場合は、env_for_icons.batの絶対パスを見直すこと。) 設定結果の確認 エクスプローラ上で右クリックして、「WinpythonPromptをここで開く」が表示されることを確認し、これを選択すれば、エクスプローラ上のパスでコマンドプロンプトが開き、Python環境がロードされていることが確認できる。あら便利!! ポイントのおさらい 今回の設定のポイントは以下の2つであった。 - WinPython環境をロードするためには、env_for_icons.batを実行してやればよいということ (Anacondaの場合は「activate.bat」がこれにあたる) - レジストリを弄れば右クリックにアプリケーションの実行コマンドを登録できるということ 参考にした情報 最後に(筆者について) 私事だが、今回記事が筆者のQiita初投稿である。筆者は宇宙関連製品の開発に従事する、いわゆる「ものづくりエンジニア」である。これから、特にものづくりの開発現場で活用できるようなちょっとしたTipsを発信していきたい。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ColabでOpenCVで動画を再生しようとしたら画像が出力され続けてしまう

はじめに 最近画像処理をしっかりと勉強していこうと思い、まずはOpenCVを用いた画像処理を勉強しています。 そこで、OpenCVの本を利用してどのような前処理があるのかや専門用語などの理解を進めています。 画像処理用の開発環境は特に用意していないので、簡単に使えるGoogle Colablatoryを利用して学習を進めていますが、OpecCVとの親和性があまり良くないためか?書籍のコードではColab上では動かないことが多いです。 今回もColab上では想定通りに動かなかったことがあったため記事にしました。 問題 動画を読み込んで再生する処理を行います。 書籍をColabで動かせるように修正を行い以下のコードを実行しました。 import sys import cv2 cap = cv2.VideoCapture('data/campus.mp4') if not cap.isOpened(): print('Can not open video file') sys.exit() while True: ret, img = cap.read() if not ret: break cv2_imshow(img) if cv2.waitKey(30) == 27: break cap.release() すると以下のように1フレームずつが、出力されてしまいます。 本来であれば、1つのウィンドウ内でフレームが出力されなければ動画にはなりません。 解決方法 How to Capture and Play Video in Google Colab?こちらの記事に解決方法がありました。 from IPython.display import HTML from base64 import b64encode def show_video(video_path, video_width = 600): video_file = open(video_path, "r+b").read() video_url = f"data:video/mp4;base64,{b64encode(video_file).decode()}" return HTML(f"""<video width={video_width} controls><source src="{video_url}"></video>""") show_video(video_path) このコードを実行することでColab上でも動画を再生することができます。 また、フレームの途中で前処理(2値化)して、動画を保存する処理を行ったところ、このコードでは再生できず、以下の記事を参考にし動かすことができました。 Google Colaboratory 上の cv2 で作成した動画を表示する make_video.ipynb import cv2 # ビデオファイルを開く cap = cv2.VideoCapture('./data/sample2.mp4') # ビデオファイルの保存設定 rec = cv2.VideoWriter('./data/video_dst.mp4', cv2.VideoWriter_fourcc(*"mp4v"), 30, (640, 480)) # ループ開始 while True: # 1フレーム読み込み ret, src = cap.read() if not ret: break # グレースケールに変換 dst = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY) # 2値化 ret, dst = cv2.threshold(dst, 128, 255, cv2.THRESH_BINARY) # 3チャンネルに変換 dst = cv2.cvtColor(dst, cv2.COLOR_GRAY2BGR) # cv2_imshow(dst) # 1フレーム書き込み rec.write(dst) # キー入力待機(30 ms)。Escキーで中断。 if cv2.waitKey(30) == 27: break rec.release() start_movie.ipynb !ffmpeg -i ./data/video_dst.mp4 -vcodec vp9 ./out.webm from IPython.display import HTML import base64 import io def play(file_path): video = io.open(file_path, 'r+b').read() encoded = base64.b64encode(video) return(HTML(data='''<video width="320" height="240" controls><source src="data:video/mp4;base64,{0}" type="video/mp4" /></video>'''.format(encoded.decode('ascii')))) play('./out.webm') また、フレームごとの前処理で # ビデオファイルの保存設定 rec = cv2.VideoWriter('data/video_dst.mp4', cv2.VideoWriter_fourcc(*'H264'), 30, (640, 480)) としていましたが、H264だと動画の保存ができなかったため、mp4vにしています。 おわりに OpenCVを本格的に利用していくとなるとColabでは厳しいのかなとすこし思い始めました。画像処理を勉強したらそれ用の環境をつくろうかと思います。 Dockerでも書籍のコードは動かなそうと思うと大変そうです。 Colabの相性でつまずくことが多そうなので、またつまずいたら記事にまとめていきます。 参考文献 How to Capture and Play Video in Google Colab? Google Colaboratory 上の cv2 で作成した動画を表示する
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

argparseで、コマンドライン引数の値が格納されない時の対応

コマンドライン引数から、 python test.py --box ok と入力した。 test.py内では、 parser.add_argument('--box_path', default = "test") args = parser.parse_args() x = args.box #コマンドライン引数の値を格納 print(x) としたところ、 test と出力されていた。 当然で、--box_pathを指定していなかっただけ。 エラーもはかないから、困ったが、変数変更でプログラムを変更した際、引数を変えるのを忘れていた。 parser.add_argument('--box', default = "test")と変更すると、 ok と出力された。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Youtubeの動画を元に始めるPython(1)

参考動画 以下の動画を参照に学習を進めた。 目標 Pythonを用いた自動化やWebスクレイピングの土台を作る。 実践 上記動画のvol.002でも紹介されている通り、Google Colaboratoryを用いてコーディングを進めていく。 環境構築の必要なくPythonのコードに触れることが出来るので比較的取っかかりやすい。 Javaとの違い (動画のvol.010まで) ※あくまで筆者がJavaしか触れてこなかったため、自分の備忘として残す※ ※学習中なので間違った情報である可能性もあります※ (1)べき乗の書き方が異なる  Java :3^2  python:3**2 (2)リスト型の仲間に辞書型、タプル型が存在する  リスト型: nemes = ['aa', 'bb', 'cc']  辞書型 : scores = {'aa':1, 'bb':2, 'cc':3}  タプル型: tap = ('aa', 'bb', 'cc')  辞書型はJavaでいうMapのような立ち位置。  タプル型は値の変更が出来ないので定数配列のような場合に使用? (3)for文を回す際にzip,enumerateという関数が使用できる  ・zipを使用する場合   for item1, item2 in zip(itemList1, itemList2)  ・enumerateを使用する場合   for num, item1 in enumerate(itemList1) ※numにはリストの要素番号が0から設定される  Javaの拡張for文のような扱いが出来る
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

pythonでカレンダーアプリ作成

カレンダーアプリの作成を行いました! コードは以下の通りになります。 Qiita.py import tkinter as tk import calendar as cl tkinterとcalendarをimportし、asを使って省略 def pre_month(): global y global m if m == 1: m = 12 y = y - 1 else: m = m - 1 lbl.configure(text=cl.month(y,m)) 関数を追加し、ひと月前を表示させる ラベル表示を変更 def add_month(): global y global m if m == 12: m = 1 y = y + 1 else: m = m + 1 lbl.configure(text=cl.month(y,m)) 関数を追加し、ひと月先を表示させる ラベル表示を変更 root = tk.Tk() root.geometry("300x200") root.title("カレンダー") 画面表示を準備 y=2021 m=4 変数を作成し、y,mに数字を入れる lbl = tk.Label(text=cl.month(y,m)) lbl.pack() カレンダーモジュールを使って文字列型としてカレンダー形式が返ってくる ラベルとラベルの配置を作成 btn1 = tk.Button(text="←",command=pre_month) btn2 = tk.Button(text="→",command=add_month) btn1.place(x=100,y=150) btn2.place(x=150,y=150) ボタンとボタンの配置を作成 tk.mainloop() 実行結果  カレンダーアプリの完成になります。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

並列分散処理を用いたシステムトレーディング

はじめに agentの行動として、 BUY、HOLD、SELLの三つの内一つを選択する。環境の戻り値として、状態(今現在保有しているポジションの価格、市場価格、手持ちのキャッシュ)、報酬(手持ちのキャッシュの変化値(含む益も含む))、終了(取引の終了か否か)、情報(ターミナルにディスプレイする情報)を返す。 マルチスレッドとマルチプロセス マルチスレッドの特徴は以下の通り ・平行処理 ・GILロックを持っているスレッドのみ、実行可能、他のスレッドは待機する。 ・cpuのコア数に依存しない。 マルチプロセスの特徴は以下の通り ・並列処理 ・メモリーが共有されていないので、値の受け渡しが大変。 ・tensowflowだと、modelが動かないことがある。 ・cpuのコア一つにプロセスを割り当てする。 cpuバウンドとはcpu内で行なっている数値計算などの処理 ソースコードはこちら 使用データについて トレンド傾向の掴みやすさから、yahoo financeからGSPCの日足を使用した。 訓練データの期間:2015/1/1 - 2017/6/30 テストデータの期間:2017/7/1 - 2021/1/1 以下ソースコード ループ class Task: def __init__(self, name): self.name = name self.num = 0 self.sum = 0.0 def run(self): while True: sleep(1) if self.num == 3: break print('roop_name = ' + self.name + ' :num = '+ str(self.num) + ' :sum = '+ str(self.sum)) self.num += 1 self.sum += random.random() name = 'nomal-roop' start = time.time() for i in range(4): w = Task('roop_point_'+str(i)) w.run() end = time.time() - start arr.append("name:" + name + " process_time:{0}".format(end) + "[s]") roop_name = roop_point_0 :num = 0 :sum = 0.0 roop_name = roop_point_0 :num = 1 :sum = 0.642469181212962 roop_name = roop_point_0 :num = 2 :sum = 1.5964812171373977 roop_name = roop_point_1 :num = 0 :sum = 0.0 roop_name = roop_point_1 :num = 1 :sum = 0.8876820994429431 roop_name = roop_point_1 :num = 2 :sum = 1.627826300716026 roop_name = roop_point_2 :num = 0 :sum = 0.0 roop_name = roop_point_2 :num = 1 :sum = 0.03546302344611851 roop_name = roop_point_2 :num = 2 :sum = 1.0239282875765587 roop_name = roop_point_3 :num = 0 :sum = 0.0 roop_name = roop_point_3 :num = 1 :sum = 0.602393530385244 roop_name = roop_point_3 :num = 2 :sum = 1.555539488491399 マルチスレッド class Task: def __init__(self, name): self.name = name self.num = 0 self.sum = 0.0 def run(self): while True: sleep(1) if self.num == 3: break print('roop_name = ' + self.name + ' :num = ' + str(self.num) + ' :sum = ' + str(self.sum)) self.num += 1 self.sum += random.random() name = 'thread-pool' start = time.time() thread_num = 4 threads = [] for i in range(thread_num): threads.append(Task(name=f'thread_{i}')) datas = [] with ThreadPoolExecutor(max_workers = thread_num) as executor: for task in threads: job = lambda: task.run() datas.append(executor.submit(job)) end = time.time() - start arr.append("name:" + name + " process_time:{0}".format(end) + "[s]") roop_name = thread_0 :num = 0 :sum = 0.0 roop_name = thread_1 :num = 0 :sum = 0.0 roop_name = thread_2 :num = 0 :sum = 0.0 roop_name = thread_3 :num = 0 :sum = 0.0 roop_name = thread_0 :num = 1 :sum = 0.7829927782861958 roop_name = thread_2 :num = 1 :sum = 0.7264674393557742 roop_name = thread_1 :num = 1 :sum = 0.4721450639806136 roop_name = thread_3 :num = 1 :sum = 0.2746835685320669 roop_name = thread_0 :num = 2 :sum = 0.8189509274906515 roop_name = thread_1 :num = 2 :sum = 0.7522106668563098 roop_name = thread_2 :num = 2 :sum = 1.3346477522815392 roop_name = thread_3 :num = 2 :sum = 0.33216049073474685 関数のidについて job = lambda: task.run()でラムダ式にさせないと、ただのループになってしまう。 このことについて調べた。 def double(n): return n * 2 for _ in range(5): lambda_ver = lambda: double(2) print(id(lambda_ver)) print(' ') for _ in range(5): lambda_ver = double(2) print(id(lambda_ver)) 140396010246352 140396010249808 140396009553344 140396009595376 140396009595952 140395963095440 140395963095440 140395963095440 140395963095440 140395963095440 と言うふうにlambda式を使わないと同一のオブジェクトidになってしまうことがわかる。 つまり、同一のオブジェクトをループさせていると言うことになっている。 マルチプロセス class Task: def __init__(self, name): self.name = name self.num = 0 self.sum = 0.0 def run(self): while True: sleep(1) if self.num == 3: break print('roop_name = ' + self.name + ' :num = ' + str(self.num) + ' :sum = ' + str(self.sum)) self.num += 1 self.sum += random.random() name = 'multi-process' start = time.time() p_inst = [Task('work1'),Task('work2'),Task('work3'),Task('work4')] Task = [] for i in p_inst: p = Process(target=i.run,) Task.append(p) p.start() for w in Task: w.join() end = time.time() - start arr.append("name:" + name + " process_time:{0}".format(end) + "[s]") roop_name = work1 :num = 0 :sum = 0.0 roop_name = work2 :num = 0 :sum = 0.0 roop_name = work3 :num = 0 :sum = 0.0 roop_name = work4 :num = 0 :sum = 0.0 roop_name = work1 :num = 1 :sum = 0.32601928337976416 roop_name = work2 :num = 1 :sum = 0.394125272204221 roop_name = work3 :num = 1 :sum = 0.6268785557359723 roop_name = work4 :num = 1 :sum = 0.09698983618263579 roop_name = work1 :num = 2 :sum = 0.5691443562637948 roop_name = work2 :num = 2 :sum = 0.6206409805829249 roop_name = work3 :num = 2 :sum = 0.821770663159113 roop_name = work4 :num = 2 :sum = 0.6171283310993135 実行時間 name:nomal-roop   process_time:16.021376371383667[s] name:multi-thread process_time:4.008574485778809[s] name:multi-process process_time:4.034740686416626[s] 実装と結果 下記の図より、マルチプロセスとマルチスレッドの収益、勝率で大きな違いがないことがわかる。 マルチプロセスのソースコードはこちら マルチスレッドのソースコードはこちら
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Pythonのwindllでメッセージボックスを使いこなす

今回はPythonのwindllを使ってメッセージボックスを表示させます。 tkinterやwxPythonを使わない方法です。 まぁtkinterやwxPythonを使った方が簡単なので、今回の記事はあんまり需要はないと思いますが... tkinterやwx向け↓ wxPythonでメッセージボックスを表示させる Tkinterでメッセージボックスを表示させる -メッセージボックスをフルに使う- っで、windllなのでWindowsじゃないと実行できません! Macとかではエラーになると思うので。 サンプルコード import sys from ctypes import * user32 = windll.user32 user32.MessageBoxW(0, "This is MessageBox\nOK ボタンと「i」アイコン","Title", 0x00000000|0x00000040) user32.MessageBoxW(0, "This is MessageBox\nOK キャンセル ボタンと「?」アイコン","Title", 0x00000001|0x00000020) user32.MessageBoxW(0, "This is MessageBox\nはい いいえ ボタンと「?」アイコン","Title", 0x00000004|0x00000020) user32.MessageBoxW(0, "This is MessageBox\nはい いいえ キャンセル ボタンと「!」アイコン","Title", 0x00000003|0x00000030) user32.MessageBoxW(0, "This is MessageBox\n中止 再試行 中止 ボタンとエラーアイコン","Title",0x00000002|0x00000010) user32.MessageBoxW(0, "This is MessageBox\n再試行 キャンセル ボタンと「!」アイコン","Title", 0x00000005|0x00000030) user32.MessageBoxW(0, "This is MessageBox\nキャンセル 再実行 続行 ボタンとエラーアイコン","Title",0x00000006|0x00000010) a=user32.MessageBoxW(0, "戻り値もあります。","Title",0x00000003|0x00000030) user32.MessageBoxW(0,"戻り値:" + str(a),"タイトル",0x00000040) #戻り値 #はい: 6 #いいえ: 7 #キャンセル: 2 #OK: 1 #再試行: 4 #中止: 3 #再実行: 10 #続行: 11 #無視: 5 環境はWindows 10 Pro ですが場合によっては正しく表示されない場合があります。 そのときはMessageBoxAを使いましょう。 アイコンの指定 コード 内容 0x00000010 エラーアイコン 0x00000020 はてなアイコン 0x00000030 警告アイコン 0x00000040 情報アイコン ボタンの指定 コード 内容 0x00000000 [OK] 0x00000001 [OK] [キャンセル] 0x00000002 [中止] [再試行] [無視] 0x00000003 [はい] [いいえ] [キャンセル] 0x00000004 [はい] [いいえ] 0x00000005 [再試行] [キャンセル] 0x00000006 [キャンセル] [再実行] [続行] デフォルトボタンの指定 コード 内容 0x00000000 最初のボタン 0x00000100 二番目のボタン 0x00000200 三番目のボタン その他オプション コード 内容 0x00040000 常に最前面 戻り値 コード 内容 1 [OK] 2 [キャンセル] 3 [中止] 4 [再試行] 5 [無視] 6 [はい] 7 [いいえ] 10 [再実行] 11 [続行] まぁこのメッセージボックスを使う意味はあまりないと思いますが、windllで独自GUIライブラリを作りたいって人は必要になるかもしれません。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

RTX30XX 系で Tensorflow を安定動作させる

簡単にまとめると CUDA 11.3 のインストール cuDNN 8.2 系のインストール pip install tensorflow==2.5.0 tf.test.is_gpu_available() で確認 私の環境 OS Ubuntu 20.04LTS Device RTX3060 クリーンインストール直後を想定してます。 これまでの問題 CUDA 11.0 cuDNN 8.0.4 Tensorflow 2.4.0 で tf.keras を使ってCNNしたいが、なぜか Dense は動くのに Conv2D が動かない。魔法のコード(記事最下段)を入力してなんとなく動くようになっても ptxas? のエラーコードが邪魔だし遅い。 今回このあたりの解決を確認済み。 前準備 アップデート sudo apt update sudo apt upgrade nouveau の無効化。このへんを参照。 /etc/modprobe.d/blacklist-nouveau.conf blacklist nouveau options nouveau modeset=0 sudo update-initramfs -u 再起動して lsmod | grep -i nouveau して nouveau 無効化を確認。何も出てこなかったらOK。 一応いれとく sudo apt install build-essential CUDA Driver & CUDA 11.3 のインストール 以下ページをめちゃくちゃ参考にしています。なんならここをみてやったほうがいいかも。ただ、インストールするバージョンだけ違うので注意。 NVIDIA グラフィックスドライバ,NVIDIA CUDA ツールキット 11.0,NVIDIA cuDNN 8.0.5 のインストール(Ubuntu 上) 金子邦彦研究室 リポジトリの登録 sudo wget -O /etc/apt/preferences.d/cuda-repository-pin-600 https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/7fa2af80.pub sudo add-apt-repository "deb http://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/ /" CUDAのインストール。ドライバも一緒に入ります。 sudo apt -y install cuda-11-3 インストールが終わったら、以下でパスを通す。 export CUDA_PATH=/usr/local/cuda-11.3 echo 'export CUDA_PATH=/usr/local/cuda-11.3' >> ${HOME}/.bashrc export LD_LIBRARY_PATH=/usr/local/cuda-11.3/lib64:${LD_LIBRARY_PATH} echo 'export LD_LIBRARY_PATH=/usr/local/cuda-11.3/lib64:${LD_LIBRARY_PATH}' >> ${HOME}/.bashrc export PATH=/usr/local/cuda-11.3/bin:${PATH} echo 'export PATH=/usr/local/cuda-11.3/bin:${PATH}' >> ${HOME}/.bashrc 再起動。ドライバの動作確認 nvidia-smi Fri Jul 30 15:11:59 2021 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 470.57.02 Driver Version: 470.57.02 CUDA Version: 11.4 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |===============================+======================+======================| | 0 NVIDIA GeForce ... On | 00000000:01:00.0 Off | N/A | | 0% 49C P8 16W / 170W | 732MiB / 12053MiB | 7% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| | 0 N/A N/A 966 G /usr/lib/xorg/Xorg 100MiB | | 0 N/A N/A 1503 G /usr/lib/xorg/Xorg 302MiB | | 0 N/A N/A 1672 G /usr/bin/gnome-shell 54MiB | | 0 N/A N/A 2191 G ...AAAAAAAAA= --shared-files 93MiB | | 0 N/A N/A 2444 G /usr/lib/firefox/firefox 166MiB | | 0 N/A N/A 2757 G /usr/lib/firefox/firefox 2MiB | +-----------------------------------------------------------------------------+ 右上の CUDA Version: 11.4 は関係ないので無視。 nvcc の確認もしましょう。 nvcc -V nvcc: NVIDIA (R) Cuda compiler driver Copyright (c) 2005-2021 NVIDIA Corporation Built on Mon_May__3_19:15:13_PDT_2021 Cuda compilation tools, release 11.3, V11.3.109 Build cuda_11.3.r11.3/compiler.29920130_0 cuDNNのインストール リポジトリの登録。 cd /tmp wget https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu2004/x86_64/nvidia-machine-learning-repo-ubuntu2004_1.0.0-1_amd64.deb sudo dpkg -i nvidia-machine-learning-repo-ubuntu2004_1.0.0-1_amd64.deb sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/7fa2af80.pub sudo apt update 入れれるパッケージ名を確認 apt-cache search cudnn 確認したパッケージをインストール sudo apt -y install libcudnn8 libcudnn8-dev TensorFlow 2.5.0 の動作には cuDNN 8.2系が必要みたいで、現時点(2021/7/30)時点では上のコマンドで8.2.2が入るため問題ないですが、将来的に必ずしもこのコマンドで所望のバージョンが得られるかはわかりません。 インストールされたパッケージリストの取得 dpkg -l | grep cuda Anaconda のインストール Pythonの仮想環境として Anaconda を使います。なんでもいいというか、むしろ pyenv のほうが望ましいかもしれませんが、Anacondaに慣れてしまった&問題なく動いているためこれでいきます。 ホームページからLinuxインストーラをダウンロードし、ダウンロードしたディレクトリでシェルを実行します。 bash Anacondaうんたらかんたら.sh ぜったいに sudo でしないこと。 あとはぽちぽち指示通りにインストールするだけでOK。ターミナルを再起動すると頭に (base) とついて、Anacondaが動いてることを確認できます。 環境を作成してTensorflowのインストール 仮想環境の作成 conda create -n tensorflow python=3.8 できたら conda activate tensorflow して tensorflow 環境に入る。 conda activate tensorflow Anaconda では conda コマンドを使用してあれこれパッケージを入れるのが普通ですが、私はこれを仮想環境としてしか使っていないので、普通に pip で入れます。一応それぞれちゃんと Anaconda のものが動いていることを確認。 which pip which python anaconda3 の文字があればOK。 そしたら、pip でインストール pip install numpy pillow matplotlib opencv-contrib-python pip install tensorflow==2.5.0 tensorflow_datasets tensorflow-hub できたら、pythonコマンドでPython REPLを起動して、 import tensorflow as tf tf.test.is_gpu_available() でGPUが使えるか確認。True がでたらOK。  備考 CUDA 11.1以上でないとRTX30series はサポートされないらしい。 公式HPに記載の Tensorflow 2.4.0 は CUDA 11.0は動くけど CUDA 11.1 は動かないらしい。 今回の方法でやれば、RTX30series を CUDA 11.0、cuDNN 8.0.4、Tensorflow 2.4.0 で無理やり動かしたときに必要な from tensorflow.compat.v1 import ConfigProto from tensorflow.compat.v1 import InteractiveSession config = ConfigProto() config.gpu_options.allow_growth = True session = InteractiveSession(config=config) は不要。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Python】forrtl: error (200): program aborting due to control-C eventと表示されたときの対処法

症状 anacondaでpythonの仮想環境を作って動かしたプログラムをCtrl+Cで強制終了しようとしたら以下のエラーがでた。動作環境はWindows10 Python3.8.5 forrtl: error (200): program aborting due to control-C event Image PC Routine Line Source libifcoremd.dll 00007FFF0F3A3B58 Unknown Unknown Unknown KERNELBASE.dll 00007FFF857E4573 Unknown Unknown Unknown KERNEL32.DLL 00007FFF88C67974 Unknown Unknown Unknown ntdll.dll 00007FFF891EA2F1 Unknown Unknown Unknown 対処法 使ってたライブラリ(scipy)が古かったらしい。 pip install --upgrade scipy アップグレードしたら治った。それだけ。 参考元
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

pythonでcsvファイルを読み込み表示させる

シンプルですが,単に,csvファイルを読み込み表示させるpythonプログラムです. import pandas as pd #import matplotlib.pyplot as plt #もちろん,これはなくてもいいですね... #import numpy as np #もちろん,これもなくてもいいですね... import csv inp_file="C:\\Users\\name\Desktop\\nmea20210705\\2021-07-05_09_GNRMC.csv" #ファイルがUTF-8なら enc_sty="UTF-8" #ファイルがshift_jisなら # enc_sty="shift_jis" with open(inp_file, "r", encoding=enc_sty, errors="", newline="" ) as f: lst = csv.reader(f, delimiter=",") # df = pd.DataFrame(lst).rename(columns={0:'ID',1:'time',2:'de',3:'lat',5:'lon',7:'knot',9:'date',12:'mode'}) df = pd.DataFrame(lst) # 読み込んだファイルを表示する df
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PyCharmでjupyterのデバッグを行う方法

はじめに 有料版Pycharm (月額2,290円、学生は無料) には、jupyterファイルのデバッグを行う機能がありますが、デバッグを行う上で少し引っかかった場所があったためメモします。 機能 jupyterの機能に加えて、変数の値やインスタンスの中身を一覧で見ることができたり、ブレークポイントを設定してデバッグを行うことができます。(jupyterにも拡張機能のVariable Inspectorで変数の値の一覧を表示したりimport pdb; pdb.set_trace()でデバッグする機能もありますが、とても簡易的なものです。) 少し見づらいですが、実行画面はこのようになります。左にコードやマークダウンを記述して、右側に結果が出力されます。そして、下側にすべての変数が一覧表示されています。 詰まったところ デバッグを行うとき、普通の.pyファイルと同じようにDebug Configurationsを設定して虫アイコンをクリックしていたのですが、NameErrorが出ました。エラーをコピペして調べてみても全然ヒットしません。 ドキュメントを読んで確かめると、Debug Configurationsは必要なく、jupyterセルの三角アイコンをクリックして表示される虫アイコンをクリックするとデバッグができることが分かりました。 おわりに jupyterは変数の値をキャッシュして扱いやすいですが、デバッグしづらいことが欠点だと思います。PyCharmを用いると、この欠点を補うことができるので便利です。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Django django-admin startproject ~~ . ドットあり

$ mkdir test $ cd test $ python3 -m venv myenv $ source myenv/bin/activate $ pip install django $ django-admin startproject testproject #.ドットなし $ tree -a test -L 2 #出力 test ├── myenv │   ├── bin │   ├── include │   ├── lib │   ├── pip-selfcheck.json │   └── pyvenv.cfg └── testproject ├── manage.py └── testproject $ django-admin startproject testproject のコードで末尾に.ドットを付けなで打つと Django開発を進める際 cd testprojectで移らないとmanage.pyがあるところには行けないが 末尾にドットをつけると $ mkdir testproject $ cd testproject $ python3 -m venv myenv $ source myenv/bin/activate $ pip install django $ django-admin startproject testproject . #.ドットあり $ tree -a testproject -L 1 #出力 testproject ├── manage.py ├── myenv │   ├── bin │   ├── include │   ├── lib │   ├── pip-selfcheck.json │   └── pyvenv.cfg └── testproject ├── __init__.py ├── asgi.py ├── settings.py ├── urls.py └── wsgi.py 既に開発ディレクトリ内にいる状態になりわざわざcd testprojectのようにする必要はなく, manage.pyがすぐに使用できるようになり作業効率が上がる!!!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Djangoプロジェクト作成の際の末尾 " . " について

Djangoにてプロジェクトを作成する際のお話 $ django-admin startproject testproject の末尾に.を付けないで実行をすると、プロジェクトファイルがカレントディレクトリ下に作られたディレクトリに入れられる。 ターミナル $ mkdir test $ cd test $ python3 -m venv myenv $ source myenv/bin/activate $ pip install django $ django-admin startproject testproject #.ドットなし $ tree -a test -L 2 #出力 test ├── myenv │   ├── bin │   ├── include │   ├── lib │   ├── pip-selfcheck.json │   └── pyvenv.cfg └── testproject ├── manage.py └── testproject それに対し、$ django-admin startproject testproject .の様に末尾に.を指定し実行をする事で... ターミナル $ mkdir testproject $ cd test $ python3 -m venv myenv $ source myenv/bin/activate $ pip install django $ django-admin startproject testproject . #.ドットあり $ tree -a test -L 1 #出力 test ├── manage.py ├── myenv │   ├── bin │   ├── include │   ├── lib │   ├── pip-selfcheck.json │   └── pyvenv.cfg └── testproject ├── __init__.py ├── asgi.py ├── settings.py ├── urls.py └── wsgi.py カレントディレクトリ下に直接プロジェクトファイルが配置され、わざわざディレクトリ間を移動しなくて良くなる。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Google Colaboratoryでグラフを描く

出先でちょっとしたグラフを描きたい、けど手元の環境にRもMATLABもOctaveもExcellも無ぇ!(Pythonも無ぇ) じゃあ python 使って Google Colaboratoryでさくっと描きたいな、となった。 記事内の画像はGoogle Colaboratory( https://colab.research.google.com ) でコードを実行して生成。 グラフ描画には matplotlib を使う。公式ドキュメントのほか、意外にもWikipediaが優しい。 自分向けメモなので利用機会に随時更新 どんな人向け? 細かいことは知らないがとにかく簡単なグラフを生成したい 何もない環境で急遽グラフが必要になった Pythonよく知らない もっと詳しいQiita記事は十分あるので、ここでは最小限にまとめる 詳細を知りたい場合は以下の記事やページを見るべき 参考 公式ドキュメンテーション matplotlibでのプロットの基本 早く知っておきたかったmatplotlibの基礎知識、あるいは見た目の調整が捗るArtistの話 matplotはMATLABライクなので、MATLABでの記述方法も参考になるかと。 基本と折れ線グラフ グラフ描画のための最低限の記述例 $f(x) = -x^2 + 1$ の折れ線グラフのコード: import numpy as np import matplotlib.pyplot as plt x = np.linspace(-1,1,1000) # 定義域をn等分した等差数列xを定義 f = -x**2 + 1 # f(x) の式を定義 plt.figure() plt.plot(x,f) plt.show() 実行結果: plt.figure():画像の土台の生成と有効化 plt.plot(x, y):横軸をx, 縦軸をyの値に対応させて折れ線グラフを描画 plt.show():画像の描画を行う関数 実は Google Colabolatory では、plt.figure()とplt.show()を省いても画像を生成してくれる。 fの定義式をplt.plotに直接投げれば4行でグラフが出来ちゃうんだ 各種グラフ ここらへんはWikipediaに大体載ってる(2021/07/30時点) 棒グラフ(plt.bar) 棒グラフはplt.bar(x, height, option... )で生成 横軸が数値の場合はxに数列を入れればよいが、文字列に置き換えるときはtick_labelオプションを変更する。 棒の太さはwidthを変更する。 import numpy as np import matplotlib.pyplot as plt points = np.array([80, 90, 55, 93, 43]) names = ["Sakura", "Shaoran", "Cerberus", "Tomoyo", "Meirin"] x = np.array([1, 2, 3, 4, 5]) # 数値に文字列を割り当てる 要素数の対応に注意 plt.figure() plt.bar(x, points, tick_label = names, width = 0.75) plt.show() 実行結果: 他 タイトルやラベルに日本語を使う タイトルはplt.title(title)でつける。 日本語を使う場合、実行前に別のセルでjapanize-matplotlibというモジュールをインストールする。公式のものではないが、Google Colab でさくっと日本語を使いたい場合に便利。やや面倒だが、他にも方法はある。 # 日本語を使いたい場合 実行後にランタイムを再起動すること pip install japanize-matplotlib import numpy as np import matplotlib.pyplot as plt import japanize_matplotlib # ラベルやタイトルに日本語を使う場合 points = np.array([80, 90, 55, 93, 43]) names = ["大岡", "水戸", "長谷川", "拝", "中村"] left = np.array([1,2,3,4,5]) plt.figure() plt.xticks(fontname = "IPAexGothic") plt.title("時代劇主人公の名前といえば?") plt.bar(left, points, tick_label = names) plt.show() 実行結果:
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

辞書を使ってエクセルに書き込む

はじめに openpyxlでエクセルにリスト(2次元配列)の書き込みを行う場合において,辞書で書き込みをするとオシャレになります. excel.py import openpyxl wb = openpyxl.Workbook() ws = wb.worksheets[0] # ここに書き込んでいきます wb.save('sample.xlsx') リストでの書き込み リストを使ってエクセルに書き込みます list_excel.py def write_list(ws, row, col, list_data): for y, list_value in enumerate(list_data): for x, value in enumerate(list_value): ws.cell(row=row+x, column=col+y, value=value) list_data = [['nature', 1, 2, 3], ['prime', 2, 3, 5], ['Even', 2, 4, 6]] write_list(ws, 1, 1, list_data) #[('nature', 'prime', 'Even'), # (1, 2, 2), # (2, 3, 4), # (3, 5, 6)] 辞書での書き込み 辞書を使ってエクセルに書き込みます dict_excel.py def write_dict(ws, row, col, dict_data): for y, (key, list_value) in enumerate(dict_data.items()): ws.cell(row=row, column=col+y, value=key) for x, value in enumerate(list_value): ws.cell(row=row+1+x, column=col+y, value=value) dict_data = {'nature': [1, 2, 3], 'prime': [2, 3, 5], 'Even': [2, 4, 6]} write_dict(ws, 1, 1, dict_data) #[('nature', 'prime', 'Even'), # (1, 2, 2), # (2, 3, 4), # (3, 5, 6)] 最後に 良きpythonライフを 参考 投稿者:https://github.com/Hayate-Leo/python-tool https://note.nkmk.me/python-openpyxl-usage/
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Pythonで辞書を使ってエクセルに書き込む

はじめに openpyxlでエクセルにリスト(2次元配列)の書き込みを行う場合において,辞書で書き込みをするとオシャレになります. excel.py import openpyxl wb = openpyxl.Workbook() ws = wb.worksheets[0] # ここに書き込んでいきます wb.save('sample.xlsx') リストでの書き込み リストを使ってエクセルに書き込みます list_excel.py def write_list(ws, row, col, list_data): for y, list_value in enumerate(list_data): for x, value in enumerate(list_value): ws.cell(row=row+x, column=col+y, value=value) list_data = [['nature', 1, 2, 3], ['prime', 2, 3, 5], ['Even', 2, 4, 6]] write_list(ws, 1, 1, list_data) #[('nature', 'prime', 'Even'), # (1, 2, 2), # (2, 3, 4), # (3, 5, 6)] 辞書での書き込み 辞書を使ってエクセルに書き込みます dict_excel.py def write_dict(ws, row, col, dict_data): for y, (key, list_value) in enumerate(dict_data.items()): ws.cell(row=row, column=col+y, value=key) for x, value in enumerate(list_value): ws.cell(row=row+1+x, column=col+y, value=value) dict_data = {'nature': [1, 2, 3], 'prime': [2, 3, 5], 'Even': [2, 4, 6]} write_dict(ws, 1, 1, dict_data) #[('nature', 'prime', 'Even'), # (1, 2, 2), # (2, 3, 4), # (3, 5, 6)] 最後に 良きpythonライフを 参考 投稿者:https://github.com/Hayate-Leo/python-tool https://note.nkmk.me/python-openpyxl-usage/
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Progateで作ったWebアプリをDjangoで作ってみる2! Part4 -ログアウト機能編-

目標物の確認 ProgateのNode.jsコースで作ったブログアプリと同じものをDjangoで作ってみます。 Djangoでのアプリ開発の一連の流れを整理するために記していきます。 完成イメージ ログアウト機能の実装 ログアウトボタンをクリックすることによってurl→viewの順にコードが実行されていき、viewの中でログアウトをするための処理を行います。その上でログインページにリダイレクトさせます。 ログアウト用のviewを作ります。logout()を使うことによってログアウトさせます(☆1)。 blogapp/blog/views.py from django.shortcuts import render, redirect from django.views.generic import TemplateView from django.contrib.auth.models import User from django.db import IntegrityError from django.contrib.auth import authenticate, login, logout # ☆1 class BlogTop(TemplateView):... def signupview(request):... def loginview(request):... def logoutview(request): # ☆1 logout(request) return redirect('blog:login') 続いて、urls.pyファイルにコードを書きます(☆2)。 blogapp/blog/urls.py from django.urls import path from .views import BlogTop, signupview, loginview, logoutview # ☆2 app_name = 'blog' urlpatterns = [ path('', BlogTop.as_view(), name='top'), path('signup/', signupview, name='signup'), path('login/', loginview, name='login'), path('logout/', logoutview, name='logout'), # ☆2 ] これでログアウト機能は作成完了です!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AtCoderだけじゃない!こどふぉ(Codeforces) にも参加しよう?

こどふぉは、いろんな理由で嫌煙されがちだけど、みんなでいい時間にバチャをやるのはすごい楽しいから、そのことを書きます!! AtCoderとの違いをメインに、また、提出に便利なテンプレも用意してるから、是非最後まで目を通していってね? (私は今 AtCoder水色で、バチャは一番簡単な Div.3 しか取り組んでないから、コンテストごとに違うものについては、Div.3 に限った話です!) こどふぉの特徴 詳細に今知りたかったら、この記事がおすすめ! 私の印象と、今みんなに抑えて欲しいことは、 - AtCoderよりたくさんコンテストがあって嬉しい - 問題が英語で書いてあって慣れるまでちょっときつい - ややこしい問題は、問題文に図があるから、慣れれば怖くない - 本番は日本時間だと、23:35 ~ 25:35 の開催が多くてしんどい - Div.3 が一番簡単で、数字が減ると難しくなる - ABCのA, Bは、茶色の人でも書くだけのことが多いけど、こどふぉのDiv.3 は、1問目から頭を使う!!とてもいい こどふぉの何が嬉しい? 時間帯とか英語とかのせいで、本番は参加障壁があるけど、みんなでバチャで取り組めば最高だと思う!!! 普通のAtCoderのバチャや精進もいいけど、 - 新しいけど、よくある問題に出会えて嬉しい - ちょっと考える問題から、まだ難しい問題までがセットになっていて嬉しい - AtCoder のバチャでありがちな、一緒に走る人の精進に合わせての、問題の選定の手間がない バチャをやろう!!! とりあえず、バチャを一緒に走ろう☺️✨ これが言いたかった!!!笑 バチャのセット ホストがセットするんじゃなくて、各自が時間をセットするのがミソ。 (例だけど)このツイートのリンクをクリックして、自分で時間をセットしたら完成! リンクをクリックしたら、下の赤枠の時間を設定して、一番下の登録ボタンをクリックで完了! フレンド登録 一緒に参加してくれる人をTwitterで募集しよう? 並走してくれる人をこどふぉ内でフレンド登録しておくと、その人と競って参加できるよ!!相手には表示されないから、約束したなら、自分のも追加してもらうように! 以下は最近アクティブな人で、もしあなたもバチャを走るなら、登録してくれるとよき!(随時更新中) もし同時に(あるいは先に)一緒に走ってくれるなら、追加するからTwitterで教えてね! 名前 Twitter AtCoder Codeforces ぽよ Twitter AtCoder Codeforces 露草 Twitter AtCoder 非公開 ジェシ(私) Twitter AtCoder Codeforces mts Twitter AtCoder Codeforces モハラン Twitter AtCoder Codeforces みんく Twitter AtCoder Codeforces めなつ Twitter AtCoder Codeforces りあの Twitter AtCoder Codeforces さかさん Twitter AtCoder Codeforces ゆうさん Twitter AtCoder Codeforces テンプレートの用意 AtCoderは、通常1つのテストケースには1つのサンプルだけど、こどふぉの場合は1つのテストケースに複数のテストケースが入ってる???から、ちょっと工夫しておいた方がよき? import math,string,itertools,fractions,heapq,collections,re,array,bisect,sys,random,time sys.setrecursionlimit(5*10**5) inf = 10**20 mod = 10**9 + 7 def LI(): return list(map(int, input().split())) def II(): return int(input()) def LS(): return list(input().split()) def S(): return input() # これを追加してる!!!1つのテスト毎に、1回動かす用。 def solve(): n = II() ans = 0     # ここに、AtCoderのいつもの感じで処理を書いていく。 return ans def main(): t = II()     # この list() は、答えを一回保持するよう。ループの中で append してる。 res = list()     # t 回 solve() を走らせる for _ in range(t):         # 都度 print してもいいけど、デバッグしやすいから後で print res.append(solve()) for ans in res: print(ans) return 0 main() こどふぉの嫌なところ -> その対策 もちろん嫌なところもあるけど、解決策がちゃんとあるから紹介☺️✨ 提出がファイル!? 提出欄に、コードを書く欄がない!?!?!? 一切気にしないで大丈夫。これを入れます。 nok0さんありがとう!! バチャを間違えて立てた! SSRSさんありがとう!! 提出怖いよぉぉぉ〜〜? 提出したら、サンプルの実行からしてくれるけど、サンプルのWAではペナがつかない㊗️ くじらさんありがとう!! 解説どこにあるの??? ゆうさんありがとう!! 順位の付け方は?? こどふぉは AtCoder より結構ややこしくて、まず、Div.3 とその他で違うらしい。 Div.3 の話をすると、それぞれの問題をACしたときの時刻が、加算されていくみたい。だから、AtCoderならまとめて出したり、簡単な問題を後回しにできるけど、Div. 3 でそれをやるとすごく損をするから気をつけてね! (NoSub戦略を防止するって意味では、すごいいい仕組みだと思う) ところでのいみ塾って何? とりあえず、ここに表示されるようにしてみてね☺️ あ、、、ツイート貼り付けてばっか??? 競プロやってる人たちは、エンジニア界隈でも特に色々教えてくれるよね? 決して、書き起こすのが面倒とかではなく。。。。 すばらしい人がたくさんいるこの環境に感謝っ!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む