20210913のPythonに関する記事は30件です。

ABC C - 1-SAT から学んだ

んー、何とかなりそうかも。 サクッと書いたが見事に TLE SAT_rev1.py from sys import exit n = int(input()) lis = [] _lis = [] for _ in range(n): s = input() if s[0] == "!": _lis.append(s) else: lis.append(s) for x in lis: # len(lis) = 10**5 if "!"+x in _lis:# len(_lis) = 10**5 の場合、10**10 となり TLE print(x) exit() print("satisfiable") ※リスト x in s の計算量 O(n) を参照 じゃあ、試しに辞書にしてみよう。 以下で通った。 SAT_rev2.py from sys import exit n = int(input()) lis = [] dic = {} for _ in range(n): s = input() if s[0] == "!": if s not in dic: dic[s] = 0 dic[s] += 1 else: lis.append(s) for x in lis: #計算量 O(N) if "!"+x in dic:#計算量 O(1) print(x) exit() print("satisfiable") 神曰く、辞書、set は in演算子は O(1) で済む。 勉強になった。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PyTorch の Define by Run を可視化

Deep Learningフレームワークにおける計算グラフ TensorFlow, PyTorchなどのDeep Learningフレームワークにおける計算グラフの構築方法が,大きく分けて2パターンに分類される。1つ目は Define by Run 型で,2つ目は Define and Run 型である。 それぞれの特徴 Define by Run型 Chainer, PyTorchがこちらの方式を採用している データを流すときに,計算グラフの構造を決定 動的な計算グラフを定義することが可能 Define and Run型 TensorFlow(v1)がこの方式を採用している 計算グラフの構造を予め定義しておき,そこにデータを流す Define by Run が動的な計算グラフを構築できることを確認 概要 入力データによって計算グラフが変化することを確認 本稿では,Recurrent Neural Net (RNN) を可視化 torch_vizのmake_dot()を用いて,系列長が2と3の場合の計算グラフを出力 結果 系列長2の場合 (左) ループに対する重みとバイアス(fc_h.weight と hc_h.bias)が1度しか使用されない 系列長3の場合 (右) ループする回数が増えたため,2度使用されていることがわかる ソースコード 可視化 visualize_RNN.py import torch from torchviz import make_dot from RNN import RNN INPUT_SIZE = 1 TIME_LENGTH = 3 # TIME_LENGTH = 2 model = RNN() data = torch.randn(1, TIME_LENGTH, INPUT_SIZE) y = model(data) image = make_dot(y, params=dict(model.named_parameters())) image.format = "png" image.render(f"RNN_{TIME_LENGTH}s") ネットワークの定義 RNN.py import torch import torch.nn as nn class RNN(nn.Module): def __init__(self): super(RNN, self).__init__() # 入力に対する全結合層 self.fc_in = nn.Linear(1, 64) # ループに対する全結合層 self.fc_h = nn.Linear(64,64) # 出力用の全結合層 self.fc = nn.Linear(64, 10) def forward(self, x): _, length, _ = x.size() h = self.fc_in(x) h = torch.tanh(h) # 入力データの系列長に合わせてループする for i in range(1, length): h = self.fc_in(x[:, i, :]) + self.fc_h(h) h = torch.tanh(h) h = self.fc(h) return h
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AtCoder 218_d SetとListの違いの復習

はじめに この記事は、以下の問題の復習記事です AtCoder 218_d Rectangle https://atcoder.jp/contests/abc218/tasks/abc218_d いつもの感覚でListで処理したらTLE、解説ACでSetで処理したら通るので、どのくらい違うのか疑問に思って調べました。 ACのソースコード https://atcoder.jp/contests/abc218/submissions/25830932 Setで実装するとAC いつもだとListでやりがち ○:p = set([tuple(input().split()) for _ in range(N)]) ×:p = [(input().split()) for i in range(2000)] テスト用データセットと計測の条件 以下の2パターンとする Set ○:p = set([tuple(i, i) for i in range(2000)]) List ×:p = [(i, i) for i in range(2000)] テストデータセットとしては、単純に,(i,i)の点を2000個用意する 計測は、2点を選んで、他の2点を探索する部分だけを計測。(SetとListの入力部分を含まない) 計測結果 Setでの実行結果 elapsed_time:0.4602658748626709[sec] elapsed_time:0.46323299407958984[sec] elapsed_time:0.5020439624786377[sec] Listでの実行結果 elapsed_time:210.26401782035828[sec] elapsed_time:225.0454020500183[sec] elapsed_time:206.4326469898224[sec] 結論 こりゃListでTLEしたわけだ ポイントは以下の記事が参考になりました。inの処理が、ListだとO(N)、SetだとO(1)なのですね。勉強になりました。 https://qiita.com/bee2/items/4ab87d05cc03d53e19f9#in%E6%BC%94%E7%AE%97%E5%AD%90
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Pythonデータ分析の前処理カンニングシート(PandasのDataFrameのデータ確認やデータ置換する用)

前提 私事ですが、Pythonデータ分析の前処理の流れは、 DataFrameとして取り込んだデータを確認し、 どのようにデータを変換したいか考え(例えばブランクがあるので、その行は全部消したい等) データを変換する この記事は、DataFrameとして取り込んだ「データ確認」と「データ変換」で使えるカンニングシートです。 # 必要なライブラリ import pandas as pd import seaborn as sns データの確認 特定の行のデータを確認する # 頭の3行を表示 df.head(3) # 最後の4行を表示 df.tail(4) # 2,4,6行目を表示 df.loc[[1,3,5]] # 4~9行目を表示 df.loc[3:8, :] # 条件を指定して合致する行のみを表示する df[df['currency'] == 'USD'] # currencyカラムがUSDの行のみ抽出して表示。 df[df['cost'] > 30000] # costカラムが30000より大きい行のみ抽出して表示。 df[df['point'].isnull()] # pointカラムがブランクの行のみ抽出して表示。 df[df['カラム名'].isnull()]はブランクデータの確認に非常に便利。 特定の列のデータを確認する # 指定したカラムを表示。 df[['カラム名']] df.loc[:, ['カラム名']] df.iloc[:, [2]] # 3列目のカラムを表示 # 指定した複数カラムを表示。 df[['カラム名','カラム名']] df.iloc[:, [2,4]] # 3,5列目のカラムを表示 df.iloc[:, 2:5] # 3~5列目のカラムを表示 # 指定したカラムを表示、出力はSeries型 df['カラム名'] df.iloc[:, 2] # 3列目のカラムを表示 特定のセルのデータを確認する # DataFrame型で指定のセルを表示 df.loc[[3], ['カラム名']] # 4行目の指定したカラム列のみ表示 df.iloc[[2], [1]] # 3行目の2列目のみ表示 # 指定のセルの値のみ出力 df.loc[3, 'カラム名'] # 4行目の指定したカラム列のみ表示 df.loc[3]['カラム名'] # 4行目の指定したカラム列のみ表示 df.at[3, 'カラム名'] # 4行目の指定したカラム列のみ表示 df.iloc[2,1] # 3行目の2列目のみ表示 df.iat[2,1] # 3行目の2列目のみ表示 特定の範囲のデータを確認する # 4行目と6行目のデータの指定したカラム列のみ表示 df.loc[[3,5], ['カラム名','カラム名']] # 4~6行目のデータのの指定したカラム列のみ表示 df.loc[3:5, ['カラム名','カラム名']] # 3行目と4行目のデータの、2列目と3列目のカラム列のみ表示 df.iloc[[2,3], [1,2]] # 3~5行目の2~4列目のカラム列のみ表示 df.iloc[2:5,1:4] データ全体の特徴量を確認する # DataFrameの行数と列数を出力 df.shape # 各カラムのデータ数(Null出ないデータ数)とデータタイプを出力 df.info() # 各カラムのデータ数、平均、標準偏差、最小、最大、四分位を出力 df.describe() df.shapeで調べたレコード行数と、df.info()で調べたカラム別のデータ数の差分から、ブランク数とそのカラムを特定するという手法が便利。 データを視覚的に確認する # 指定したカラムがカテゴリデータの場合、カテゴリ別データ数の棒グラフを描画できる sns.countplot('カラム名',data = df) # 指定したカラムが連続データの場合、ヒストグラムを描画できる。binsオプションで棒の数を指定できる。 sns.distplot(df['カラム名'], kde = False, bins = 10) # 指定したカラムが連続データの場合、散布図を描画できる。 sns.stripplot(df['カラム名']) 視覚化して外れ値を探す。 データの変換 行を削除する # 4行目のデータが削除される df.drop(3) # 4,6,8行目のデータが削除される df.drop([3,5,7]) # どれか一つのカラムでもブランクがあれば、その行が削除される df.dropna() # 全カラムがブランクとなっている行が削除される df.dropna(how='all') # 指定したカラムがブランクの行が削除される df.dropna(subset=['カラム名']) # 指定したカラムのいずれか1つでもブランクの行が削除される df.dropna(subset=['カラム名', 'カラム名']) 列を削除する # 指定したカラムが削除される df.drop('カラム名', axis=1) # 指定した複数カラムが削除される df.drop(['カラム名','カラム名'], axis=1) 列名を変える df.rename(columns={'変更前カラム名1': '変更後カラム名1', '変更前カラム名2': '変更後カラム名2'}) ブランクに値を投入する # すべてのブランクに0を投入する df.fillna(0) # 指定したカラムのブランクに0を投入する df['カラム名'].fillna(0) # ブランクに投入する値をカラムごとに指定する df.fillna({'カラム名': 0, 'カラム名': 100, 'カラム名': 'BLANK'}) # ブランクセルの一つ上のセルの値をブランクに投入する df.fillna(method='ffill') # ブランクセルの一つ下のセルの値をブランクに投入する df.fillna(method='bfill') データの値変更 # BLANKという文字列を0に変更する df.replace('BLANK', 0) # MaleをMに、BLANKという文字列を0に変更する df.replace({'Male': 'M', 'BLANK': 0}) df.replace(['Male', 'BLANK'], ['M', 0]) # BLANKという文字列と、無しという文字列を0に変更する df.replace(['BLANK', '無し'], 0) # 指定したカラムでのみBLANKという文字列を0に変更する df.replace({'カラム名': {'BLANK': 0}}) # カラム別に変換を定義する df.replace({'カラム名': {'BLANK': 0, '無し': 0}, 'カラム名': {'Male': 'M'}}) 補足 データの変換は再代入かinplace=Trueを指定する # 以下の実行してもdfは変化しない df.drop([3,5,7]) df.replace('BLANK', 0) df.fillna(0) # 以下を実行するとdfは変化する df = df.drop([3,5,7]) df = df.replace('BLANK', 0) df = df.fillna(0) df.drop([3,5,7], inplace=True) df.replace('BLANK', 0, inplace=True) df.fillna(0, inplace=True) 参考サイト 分析の中で実際に前処理をどうやって行くかという視点で参考になる。有料だけど、前処理部分は無料で見れる。ラッキー。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Pythonデータ分析の前処理でよく使うメソッド(PandasのDataFrameのデータ確認やデータ置換する用)

前提 私事ですが、Pythonデータ分析の前処理の流れは、 DataFrameとして取り込んだデータを確認し、 どのようにデータを変換したいか考え(例えばブランクがあるので、その行は全部消したい等) データを変換する この記事は、DataFrameとして取り込んだ「データ確認」と「データ変換」で使えるカンニングシートです。 # 必要なライブラリ import pandas as pd import seaborn as sns データの確認 特定の行のデータを確認する # 頭の3行を表示 df.head(3) # 最後の4行を表示 df.tail(4) # 2,4,6行目を表示 df.loc[[1,3,5]] # 4~9行目を表示 df.loc[3:8, :] # 条件を指定して合致する行のみを表示する df[df['currency'] == 'USD'] # currencyカラムがUSDの行のみ抽出して表示。 df[df['cost'] > 30000] # costカラムが30000より大きい行のみ抽出して表示。 df[df['point'].isnull()] # pointカラムがブランクの行のみ抽出して表示。 df[df['カラム名'].isnull()]はブランクデータの確認に非常に便利。 特定の列のデータを確認する # 指定したカラムを表示。 df[['カラム名']] df.loc[:, ['カラム名']] df.iloc[:, [2]] # 3列目のカラムを表示 # 指定した複数カラムを表示。 df[['カラム名','カラム名']] df.iloc[:, [2,4]] # 3,5列目のカラムを表示 df.iloc[:, 2:5] # 3~5列目のカラムを表示 # 指定したカラムを表示、出力はSeries型 df['カラム名'] df.iloc[:, 2] # 3列目のカラムを表示 特定のセルのデータを確認する # DataFrame型で指定のセルを表示 df.loc[[3], ['カラム名']] # 4行目の指定したカラム列のみ表示 df.iloc[[2], [1]] # 3行目の2列目のみ表示 # 指定のセルの値のみ出力 df.loc[3, 'カラム名'] # 4行目の指定したカラム列のみ表示 df.loc[3]['カラム名'] # 4行目の指定したカラム列のみ表示 df.at[3, 'カラム名'] # 4行目の指定したカラム列のみ表示 df.iloc[2,1] # 3行目の2列目のみ表示 df.iat[2,1] # 3行目の2列目のみ表示 特定の範囲のデータを確認する # 4行目と6行目のデータの指定したカラム列のみ表示 df.loc[[3,5], ['カラム名','カラム名']] # 4~6行目のデータのの指定したカラム列のみ表示 df.loc[3:5, ['カラム名','カラム名']] # 3行目と4行目のデータの、2列目と3列目のカラム列のみ表示 df.iloc[[2,3], [1,2]] # 3~5行目の2~4列目のカラム列のみ表示 df.iloc[2:5,1:4] データ全体の特徴量を確認する # DataFrameの行数と列数を出力 df.shape # 各カラムのデータ数(Null出ないデータ数)とデータタイプを出力 df.info() # 各カラムのデータ数、平均、標準偏差、最小、最大、四分位を出力 df.describe() df.shapeで調べたレコード行数と、df.info()で調べたカラム別のデータ数の差分から、ブランク数とそのカラムを特定するという手法が便利。 データを視覚的に確認する # 指定したカラムがカテゴリデータの場合、カテゴリ別データ数の棒グラフを描画できる sns.countplot('カラム名',data = df) # 指定したカラムが連続データの場合、ヒストグラムを描画できる。binsオプションで棒の数を指定できる。 sns.distplot(df['カラム名'], kde = False, bins = 10) # 指定したカラムが連続データの場合、散布図を描画できる。 sns.stripplot(df['カラム名']) 視覚化して外れ値を探す。 データの変換 行を削除する # 4行目のデータが削除される df.drop(3) # 4,6,8行目のデータが削除される df.drop([3,5,7]) # どれか一つのカラムでもブランクがあれば、その行が削除される df.dropna() # 全カラムがブランクとなっている行が削除される df.dropna(how='all') # 指定したカラムがブランクの行が削除される df.dropna(subset=['カラム名']) # 指定したカラムのいずれか1つでもブランクの行が削除される df.dropna(subset=['カラム名', 'カラム名']) 列を削除する # 指定したカラムが削除される df.drop('カラム名', axis=1) # 指定した複数カラムが削除される df.drop(['カラム名','カラム名'], axis=1) 列名を変える df.rename(columns={'変更前カラム名1': '変更後カラム名1', '変更前カラム名2': '変更後カラム名2'}) ブランクに値を投入する # すべてのブランクに0を投入する df.fillna(0) # 指定したカラムのブランクに0を投入する df['カラム名'].fillna(0) # ブランクに投入する値をカラムごとに指定する df.fillna({'カラム名': 0, 'カラム名': 100, 'カラム名': 'BLANK'}) # ブランクセルの一つ上のセルの値をブランクに投入する df.fillna(method='ffill') # ブランクセルの一つ下のセルの値をブランクに投入する df.fillna(method='bfill') データの値変更 # BLANKという文字列を0に変更する df.replace('BLANK', 0) # MaleをMに、BLANKという文字列を0に変更する df.replace({'Male': 'M', 'BLANK': 0}) df.replace(['Male', 'BLANK'], ['M', 0]) # BLANKという文字列と、無しという文字列を0に変更する df.replace(['BLANK', '無し'], 0) # 指定したカラムでのみBLANKという文字列を0に変更する df.replace({'カラム名': {'BLANK': 0}}) # カラム別に変換を定義する df.replace({'カラム名': {'BLANK': 0, '無し': 0}, 'カラム名': {'Male': 'M'}}) 補足 データの変換は再代入かinplace=Trueを指定する # 以下の実行してもdfは変化しない df.drop([3,5,7]) df.replace('BLANK', 0) df.fillna(0) # 以下を実行するとdfは変化する df = df.drop([3,5,7]) df = df.replace('BLANK', 0) df = df.fillna(0) df.drop([3,5,7], inplace=True) df.replace('BLANK', 0, inplace=True) df.fillna(0, inplace=True) 参考サイト 分析の中で実際に前処理をどうやって行くかという視点で参考になる。有料だけど、前処理部分は無料で見れる。ラッキー。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

虚数が実数から現れる時(惑星の軌道編)

 前回に引き続き、Pythonを用いて、実数のみを用いた簡単な関係式をシミュレートすると不思議な結果が出てくること及び、虚数を使うとそれがうまく説明できるようなケースを紹介することで、より皆様に虚数に親しみを持ってもらおうと思います。 惑星の運動方程式  突然ですが、万有引力による惑星の運動方程式は以下のようなものになります。 \vec{F} = m\vec{a} = -\frac{GMm}{r^3}\vec{r} \\ \vec{F}:力 \\ m:惑星の質量 \\ \vec{a}:惑星の加速度 \\ G:万有引力定数 \\ M:恒星の質量 \\ m:惑星の質量 \\ \vec{r}:惑星の位置 \\ r:\vec{r}の長さ  解析的に解くには2回積分をする必要があり、かなりめんどくさいのですが、そこはPythonに任せて力任せにシミュレートすればなんともないです。また、仮定は可能な限り単純化します。$GM=1$となるような都合のいい恒星(質点)を考えます。すると以下のようになります。 m\vec{a} = -m\frac{\vec{r}}{r^3} \\ \vec{a} = \frac{\vec{r}}{r^3} \\  これをプログラムでシミュレートしていきます。 自由落下  初期条件として、$\vec{r}=(100,0),\vec{v}=(0,0)$を考えます。恒星の中心から100mの位置にある惑星が、恒星に向かって自由落下していくようなイメージです。ソースコードは以下のようになります(import等は省略)。 size = 1500 x, y, vx, vy, ax, ay = np.zeros((6, size)) x[0] = 100 y[0] = 0 vx[0] = 0.0 vy[0] = 0.0 for i in range(size-1): r = np.linalg.norm((x[i], y[i])) if r < 10: print("too close!") break ax[i] = -x[i]/r**3 ay[i] = -y[i]/r**3 vx[i+1] = vx[i] + ax[i] vy[i+1] = vy[i] + ay[i] x[i+1] = x[i] + vx[i] y[i+1] = y[i] + vy[i] plt.figure(figsize=(10, 10)) plt.scatter(x, y, s=10, c=range(size), cmap=cm.coolwarm) plt.xlim(-400, 400) plt.ylim(-400, 400) plt.grid() plt.show()  x,y,vx,vy,ax,ayがそれぞれ座標、速さ、加速度を表していて、運動方程式をシミュレートしています。rが0に近すぎる場合、計算結果がおかしくなってしまうので(現実世界でも、その前に地表に激突したり、電子の反発力に阻まれたりして、0に近い距離には近づけません)、ある閾値より小さくなった計算を打ち切ることにします。  結果は以下のようになります。  青がスタート位置、赤が終点になります。 円軌道  次に、グラフで言うと上向きに方向に初速度を加えます。うまく値を設定すると、真円の軌道に乗せることができます。vy[0]=0.1がそのような値となります。(sizeもうまく描画範囲になるように調整しています) x, y, vx, vy, ax, ay = np.zeros((6, size)) x[0] = 100 y[0] = 0 vx[0] = 0.0 vy[0] = 0.1 # ここの部分  ちなみに、vy[0] = 0.125だと以下のような楕円になります。 円でなくなる  しかし、ある速度を超えると、円軌道ではなくなってしまいます。  vy[0] = 0.1414だと以下のような感じになります。  ネタバレをするとこれは放物線になります。  vy[0] = 0.2だと以下のような感じになります。(軌道の特徴を見やすくするため、グラフの中心と尺度を変えています)  明らかに双曲線ですね。  現実の世界の天体も、(おおまかに近似すれば)このように楕円軌道(惑星、衛星)や双曲線運動(彗星等はこれの場合もあります)を行うことが知られています。 楕円曲線のパラメータ  この挙動を定量的に解析するためには、先の運動方程式を解く必要がありますが、そのあたりは先人の知恵があるので、要点だけを拝借します。楕円軌道の各パラメータは以下のようになります。 (https://www.eee.kagoshima-u.ac.jp/~watanabe-lab/misc/%E6%A5%95%E5%86%86%E3%81%A8%E5%B9%B3%E5%9D%87.pdf より引用)  半通経 $l$ は以下のように計算されます。(なお、以下のパラメータ群は、恒星の質量$M$を都合のいい場合に設定し、垂直方向にのみ初速度ある場合に成り立つ特殊値であることに注意してください) l = r^2v^2  離心率$e$はどうなるでしょうか。これは計算が少しめんどくさいのですが、結論を述べると、 e=\sqrt{1+r^2v^4-2rv^2}  になります。要は、$v=\pm\frac{1}{\sqrt{r}}$の時に最小値0を取り、$v=\pm\sqrt{\frac{2}{r}}$の時に1となり、後は増え続けるだけになります。  離心率は、 0の時は真円に 1未満の時は楕円に 1の時に放物線に 1より大きい時は双曲線  になるので、シミュレーションの結果と一致していることがわかります。  余談になりますが、以下のケースは高校物理の範囲でも計算することができます。 真円...遠心力と重力が釣り合う時 \frac{m}{r^2} = \frac{mv^2}{r} \\ v = \pm\frac{1}{\sqrt{r}} 放物線...無限遠で運動エネルギー+位置エネルギーが0になる時 0 = \frac{1}{2}mv^2 - \frac{m}{r} \\ v = \pm\sqrt{\frac{2}{r}}  さて、話を戻して、楕円のパラメータをもう少し詳しく見てみます。  軌道長半径$a$は、 a = \frac{l}{1-e^2} \\ =\frac{r^2v^2}{1-(1+r^2v^4-2rv^2)} \\ =\frac{r^2v^2}{2rv^2-r^2v^4} \\ =\frac{r}{2-rv^2} になります。  $a=f(v)$をグラフにするとこんな感じです。  vy[0]=0.1で半径100の真円になります。ちなみに、0.1以下の値だと、原点を「左側の」焦点とした楕円運動に、0.1以上だと、原点を「右側の」焦点とした楕円運動になります。軌道長半径は大きくなり続けていきますが、vy[0]が$\frac{\sqrt{2}}{10}$ でついに無限半径の楕円軌道、つまり放物線に至ります。  そこからが少し奇妙です。軌道長半径がマイナスとなってしまいました。マイナスの半径、というのはあり得るのでしょうか。そして実際の運動は双曲線となっているのですが、これらの物理的関係を見出すことはできるのでしょうか。 周期  このあたりを深堀りするために、円軌道のもう1つの要素である周期を考えてみたいと思います。  ケプラーの法則より、惑星の公転周期$P$は、 \frac{a^3}{P^2} = \frac{G(M+m)}{4\pi^2}  となりますが、今回は都合の良い物理定数を採用しているので、 P = 2\pi{\sqrt{(\frac{r}{2-rv^2})}}^3  こんな感じになります。  vy[0] = 0.1size=62831の時、  vy[0] = 0.12size=15109の時、  という感じに、周期を含めて正確にシミュレートできていることがわかります。 虚数  ここでやっとメインテーマである虚数に移ります。$v$がある値を超えると、軌道長半径$a$がマイナスになりました。  ということは、計算上は、その平方根に比例する周期は虚数の周期となります。観測上では双曲線運動となっていますが。  虚数を用いれば、$v$がある値を超えると運動の種類が変わるという「場合分け」は必要なく、「惑星は$v$の値に関わらず円運動をし、その周期は軌道長半径の3乗の平方根に比例する」という1つの記述で対応できることになります。  前回の漸化式の例では「基本的には指数関数で、ある場合に振動が現れるが、それは虚数を含めて考えたら指数関数の一種である」という整理ができましたが、今回は「基本的には円軌道で、ある場合に双曲線が現れるが、それは虚数を含めて考えたら円運動の一種である」という整理ができました。また、その「境目」には、直線が現れたり、放物線が現れたりします。  もちろんこれは同じ構造を持っていて、虚数の指数が振動的な挙動を示す、またその逆も然りということは、オイラーの公式から自然に推論できます。 余談  軌跡を計算する際に、角運動量$\vec{L}=\vec{r} \times \vec{v}$を計算すると、角運動量保存則が(楕円や放物線においても)成り立っていることがわかります。 rvec = np.array([x[i],y[i],0]) vvec = np.array([vx[i],vy[i],0]) momentum = np.cross(rvec,vvec) print(momentum)  以下は、vy[0]=0.1414の時。 [ 0. 0. 14.14] [ 0. -0. 14.14001414] [ 0. -0. 14.14002828] [ 0. -0. 14.14004242] [ 0. -0. 14.14005656] [ 0. -0. 14.1400707] [ 0. -0. 14.14008484] [ 0. -0. 14.14009898] [ 0. -0. 14.14011312] [ 0. -0. 14.14012726]...
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Python】【ffmpeg】ffmpegで.movから.mp4に変換する

はじめに 題記の通り .movから.mp4に変換する 最近、iphoneで撮影した動画をWindowsに移動させた。 しかし、拡張子が”.mov”のため、windowsで再生するには¥120を課金してコーデックが必要になる 値段が高いわけではないが、ffmpegのコマンドを使用すれば変換できることは知っていたため、GUI(もどき)で実行できるソースを作成して変換できるようにする。 なお、ffmpegの変換コードは以下の通りである $ ffmpeg -i (変換前ファイル.mov) -pix_fmt yuv420p (変換後ファイル名.mp4) これをコマンドプロンプトを開かずとも、GUIで複数ファイルを変換できるようにするため、pythonのtkinterでコーディングする。 どんな実行画面? 実行するならば、次章に記載したgithubからexeファイルをDLするか、pythonのソースコードをコピペして実行してほしい 変換したいファイルをとあるフォルダに格納すべし exeファイル or 下記pythonのソースコードを実行すべし 入力フォルダと出力フォルダを指定して、実行ボタンを押すべし 待つべし 変換完了を待つべし (同じ入力・出力フォルダを指定すると、自動的に立ち上がるコマンドプロンプトで上書きしてよいか聞かれるため、"y"で答えよ) ソースコード 細かいことは他の記事に任せ、さっさとコードを共有する。 github : https://github.com/nonono-copen/mov2mp4.git githubにexeファイルを置いておくが、他Windowsで実行可能かは確かめていないため不明 (おそらくffmpegはDLの必要ある) 未来の自分へ: githubからDLなり、下記コピペなりするが良い ただし、コードが汚いので気が向いたら直しなさい 以下コード # coding:utf-8 # 参考:https://qiita.com/dgkmtu/items/2367a73f7e2d498e6075 import os import re from tkinter import * from tkinter import ttk from tkinter import messagebox from tkinter import filedialog import subprocess def ffmpeg_cmd(i_filePath, o_filePath): # ffmpegを利用して mov ⇒ mp4に変換 cmd = 'ffmpeg -i ' + i_filePath + ' -pix_fmt yuv420p ' + o_filePath # コマンド実行 subprocess.call(cmd, shell=True) def convert_mov2mp4(): inputDirPath = entry1.get() # 入力フォルダパス outputDirPath = entry2.get() # 出力フォルダパス conv_fileCount = 0; # 処理ファイルカウント変数 if not os.path.exists(inputDirPath) or not os.path.exists(outputDirPath): # ファイルパスの入力有無を確認 messagebox.showerror("error", "指定されたパスが存在しません。") else: # 変換対象のファイルリストを取得 files = os.listdir(inputDirPath) # プログレスバーのサブウィンド progress_root = Toplevel() progress_root.title("実行中") #プログレスバーの設定 progressbar=ttk.Progressbar(progress_root,length=300,mode="indeterminate") progressbar.pack() maximum_bar=len(files) value_bar=0 progressbar.configure(maximum=maximum_bar,value=value_bar) for i, file in enumerate(files): # ファイル名と拡張子を分離 fileName, ext = os.path.splitext(file) if re.compile(ext, re.IGNORECASE).match('.mov') != None: # 拡張子がmovの時、変換コマンドを実行 # 入力ファイルパス inputFilePath = os.path.join(inputDirPath, file) # 出力ファイルパス outputFile = fileName + '.mp4' outputFilePath = os.path.join(outputDirPath, outputFile) # mp4に変換 ffmpeg_cmd(inputFilePath, outputFilePath) # 変換に成功した場合、ファイル数をカウントしてプログレスバーを更新 conv_fileCount+=1 progressbar.configure(value=conv_fileCount) else: continue # movではない場合、飛ばして次の処理 # 入力フォルダ内のmovをすべてmp4に完了後、メッセージボックスを表示 progress_root.destroy() text = str(conv_fileCount) + ' 件のmovファイルをmp4ファイル に変換しました' messagebox.showinfo("info", text) # フォルダ指定の関数 def inputDirDialogClicked(): iDir = os.path.dirname(os.path.abspath(__file__)) # 実行時のファイルの絶対パスを取得 iDirPath = filedialog.askdirectory(initialdir = iDir) # 実行時のファイルパスから参照画面を作成 entry1.set(iDirPath) def outputDirDialogClicked(): iDir = os.path.dirname(os.path.abspath(__file__)) # 実行時のファイルの絶対パスを取得 iDirPath = filedialog.askdirectory(initialdir = iDir) # 実行時のファイルパスから参照画面を作成 entry2.set(iDirPath) # main if __name__ == '__main__': # rootの作成 root = Tk() root.title("動画の拡張子 変わるんです | mov ⇒ mp4") #-------------------------------------------------------# # Frame1の作成 frame1 = ttk.Frame(root, padding=10) frame1.grid(row=0, column=1, sticky=E) # 「フォルダ参照」ラベルの作成 IDirLabel = ttk.Label(frame1, text="入力フォルダ>>", padding=(5, 2)) IDirLabel.pack(side=LEFT) # 「フォルダ参照」エントリーの作成 entry1 = StringVar() IDirEntry = ttk.Entry(frame1, textvariable=entry1, width=30) IDirEntry.pack(side=LEFT) # 「フォルダ参照」ボタンの作成 IDirButton = ttk.Button(frame1, text="参照", command=inputDirDialogClicked) IDirButton.pack(side=LEFT) #-------------------------------------------------------# # Frame2の作成 frame2 = ttk.Frame(root, padding=10) frame2.grid(row=2, column=1, sticky=E) # 「フォルダ参照」ラベルの作成 IDirLabel2 = ttk.Label(frame2, text="出力フォルダ>>", padding=(5, 2)) IDirLabel2.pack(side=LEFT) # 「フォルダ参照」エントリーの作成 entry2 = StringVar() IDirEntry2 = ttk.Entry(frame2, textvariable=entry2, width=30) IDirEntry2.pack(side=LEFT) # 「フォルダ参照」ボタンの作成 IDirButton2 = ttk.Button(frame2, text="参照", command=outputDirDialogClicked) IDirButton2.pack(side=LEFT) #-------------------------------------------------------# # Frame3の作成 frame3 = ttk.Frame(root, padding=10) frame3.grid(row=5,column=1,sticky=W) # 実行ボタンの設置 button1 = ttk.Button(frame3, text="実行", command=convert_mov2mp4) button1.pack(fill = "x", padx=30, side = "left") # キャンセルボタンの設置 button2 = ttk.Button(frame3, text=("閉じる"), command=root.destroy) button2.pack(fill = "x", padx=30, side = "left") root.mainloop() TODO フォルダだけでなく、ファイルを指定しても実行できるせよ コード汚いのでもうちょいキレイにせよ 参考リンク 【Python】tkinterでファイル&フォルダパス指定画面を作成する
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【知ってた?】えっ!?環境構築しなくてもPythonも機械学習も使えて、その上GPUまで使わせてもらえる無料ツールがあるってマジ!?

はじめに Pythonや機械学習を勉強しようと思って環境構築を試みるも挫折したことのある人におすすめのツールがあります。それはGoogle Colaboratoryです。 Google Colaboratoryとは? Colaboratoryは、ブラウザから Python を記述、実行できるサービスです。次の特長を備えています。 環境構築が不要 GPU、TPUへの無料アクセス 簡単に共有可能 使用するのに必要なのはGoogleアカウントだけです。Pythonと一通りのライブラリが揃っているので、アクセスしたらすぐに使い始めることができます。 Qiitaでの参考資料 すでにわかりやすい説明記事があるので具体的な使用方法はそれらの記事に譲らせてもらいます。 まとめ こんな便利なツールが無料で使えるなんてやっぱりGoogle様はすごいですね。寝る前に3回拝んでから床に就きましょう。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

torchvizで計算グラフを可視化

Torchvizのインストール $ pip install torchviz ネットワークの定義 可視化したいネットワークを定義する 本稿では,ニューラルネットワークを可視化する NeuralNet.py import torch import torch.nn as nn import torch.nn.functional as F INPUT_SIZE = 10 class NeuralNet(nn.Module): def __init__(self): super(NeuralNet, self).__init__() self.fc1 = nn.Linear(INPUT, 256) self.fc2 = nn.Linear(256, 128) self.fc3 = nn.Linear(128, 10) def forward(self, x): x = self.fc1(x) x = F.relu(x) x = self.fc2(x) x = F.relu(x) x = self.fc3(x) x = F.softamx(x) return x torchvizによる計算グラフの可視化 torchviz.make_dotにより可視化 入力サイズに合わせたデータを用意し,モデルに流す その出力と,モデルのパラメータを指定して画像を出力する visualize_NeuralNet.py import torch from torchviz import make_dot from NeuralNet import NeuralNet INPUT_SIZE = 28*28 model = NeuralNet() data = torch.randn(1, INPUT_SIZE) y = model(data) image = make_dot(y, params=dict(model.named_parameters())) image.format = "png" image.render("NeuralNet")
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ABC218 C - Shapes から学んだ

時間一杯つかったが、time out。 納得いったものをコンテスト後に入力したが WA だった。 改善点1 配列の回転に Append は不向き rotated_bad.py def one(S,T): lis = [] for _ in range(N): lis.append([]) for w in range(N): for h in range(N-1,-1,-1): lis[w].append(T[h][w]) S = make(S) lis = make(lis) #print(S) #print(lis) try: if check(S,lis): return True except: pass 良く書いたな、俺。 append を使う場合、4 回転、それぞれの場合における def を用意する必要があり、非効率 有識者の知恵を借りると 空欄の配列を用意し、S(orT) を 90 度回転させて代入する関数があれば 関数は一つで済む事が分かった。 rotated_good.py def rotated(S): lis = [[" "] * N for _ in range(N)] for h in range(N): for w in range(N): lis[w][N-1-h] = S[h][w] #lis[i][j] = S[j][N-1-i] #for h in range(N): # print("".join(lis[h])) #print() return lis 改善点2 平行移動と言われたら素直に平行移動しよう 当初考えたのは、 図形を含む最小の四角形を切り抜き、 S と T で行い、比較した。 しかし、Wa x 5 が残ってしまった。 平行移動のイメージ、以下の赤線の交点を左上に持っていく。 残りのセルは "." とし、N x N の構成。 とりあえず。。赤線の交点を探す。 つまり、"#" が配置されている最小の (i,j) を探す。 make.py def make(S,T): s_min_i = N s_min_j = N t_min_i = N t_min_j = N for h in range(N): for w in range(N): if S[h][w] == "#": s_min_i = min(s_min_i,h) s_min_j = min(s_min_j,w) if T[h][w] == "#": t_min_i = min(t_min_i,h) t_min_j = min(t_min_j,w) 更に、あまり枠には "." としつつ、 T,S を比較していく。 make.py def make(S,T): s_min_i = N s_min_j = N t_min_i = N t_min_j = N for h in range(N): for w in range(N): if S[h][w] == "#": s_min_i = min(s_min_i,h) s_min_j = min(s_min_j,w) if T[h][w] == "#": t_min_i = min(t_min_i,h) t_min_j = min(t_min_j,w) Schar = "" Tchar = "" for h in range(N): for w in range(N): si = s_min_i + h sj = s_min_j + w if (si < N and sj < N): Schar = S[si][sj] else: Schar = "." ti = t_min_i + h tj = t_min_j + w if (ti < N and tj < N): Tchar = T[ti][tj] else: Tchar = "." if Tchar != Schar: #print(False) return False return True あとは、4回転して試すだけ check.py for _ in range(4): S = rotated(S) if make(S,T): print("Yes") exit() print("No")
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

class で jit を使用する方法

python高速化のためのjitをclassで使用したいとき jitclassより@staticmethod を使ったほうがいいのではないかという個人メモ。 jitclass の使用例 jitclassを使えばクラスでもjitを使用することができる。 import numpy as np import matplotlib.pyplot as plt from numba import jit, f8 from numba.experimental import jitclass import time spec = [ ('arr', f8[:,:,:]), ('new_arr', f8[:,:,:]), ] @jitclass(spec) class class_jit(): def __init__(self,arr): self.arr = arr self.new_arr=np.zeros_like(arr, dtype=np.float64) def func(self): shape=self.arr.shape for x in range(shape[0]): for y in range(shape[1]): for z in range(shape[2]): self.new_arr[x,y,z]=1e6*x+1e3*y+z return self.new_arr def plot(self): plt.imshow(self.new_arr[0]) if __name__=='__main__': n=256 arr=np.zeros([n]*3) st=time.time() obj1=class_jit(arr) obj1.func() print(f'"class jit " elapsed_time {time.time()-st:2f}') "class jit " elapsed_time 0.512740 jitclass で困ったこと jitclassではjit の対応していないメンバ関数を使用することができない。 例えばクラスのほかのメンバ関数でmatplotを使おうとすると obj1.plot() plt.imshowのところでエラーを返される。 TypingError: - Resolution failure for literal arguments: Failed in nopython mode pipeline (step: nopython frontend) Unknown attribute 'imshow' of type Module @staticmethodを使って解決 jitを使用したいメンバ関数を@staticmethodで静的関数として、@jitを使用したら上手くいった。インスタンス変数を参照したい場合は、ラッパーにすればよい。 class class_jit2(): def __init__(self): pass def func(self, arr): #wrapper self.arr=arr self.new_arr=self.__func(arr) @staticmethod @jit(f8[:,:,:](f8[:,:,:])) #型指定 def __func(arr): new_arr=np.zeros_like(arr, dtype=np.float64) shape=arr.shape for x in range(shape[0]): for y in range(shape[1]): for z in range(shape[2]): new_arr[x,y,z]=1e6*x+1e3*y+z return new_arr def plot(self): plt.imshow(self.new_arr[0]) if __name__=='__main__': n=256 arr=np.zeros([n]*3) st=time.time() obj2=class_jit2() obj2.func(arr) print(f'"class jit staticmethod " elapsed_time {time.time()-st:2f}') obj2.plot() これなら、jitもmatplotも同一のクラスで使用できる。 "class jit staticmethod " elapsed_time 0.044842 申し訳程度の速度比較 import numpy as np import matplotlib.pyplot as plt from numba import jit, f8 from numba.experimental import jitclass import time def func(arr): #jitなし new_arr=np.zeros_like(arr) shape=arr.shape for x in range(shape[0]): for y in range(shape[1]): for z in range(shape[2]): new_arr[x,y,z]=1e6*x+1e3*y+z return new_arr @jit(nopython=True) #jit 型指定なし def func_jit(arr): new_arr=np.zeros_like(arr) shape=arr.shape for x in range(shape[0]): for y in range(shape[1]): for z in range(shape[2]): new_arr[x,y,z]=1e6*x+1e3*y+z return new_arr @jit(f8[:,:,:](f8[:,:,:])) #jit 型指定 def func_jit2(arr): new_arr=np.zeros_like(arr) shape=arr.shape for x in range(shape[0]): for y in range(shape[1]): for z in range(shape[2]): new_arr[x,y,z]=1e6*x+1e3*y+z return new_arr spec = [ ('arr', f8[:,:,:]), # a simple scalar field ('new_arr', f8[:,:,:]), # an array field ] @jitclass(spec) class class_jit(): def __init__(self,arr): self.arr = arr self.new_arr=np.zeros_like(arr, dtype=np.float64) def func(self): shape=self.arr.shape for x in range(shape[0]): for y in range(shape[1]): for z in range(shape[2]): self.new_arr[x,y,z]=1e6*x+1e3*y+z return self.new_arr class class_jit2(): def __init__(self): pass def func(self, arr): self.arr=arr self.new_arr=self.__func(arr) @staticmethod @jit(f8[:,:,:](f8[:,:,:])) def __func(arr): new_arr=np.zeros_like(arr, dtype=np.float64) shape=arr.shape for x in range(shape[0]): for y in range(shape[1]): for z in range(shape[2]): new_arr[x,y,z]=1e6*x+1e3*y+z return new_arr if __name__=='__main__': n=256 arr=np.zeros([n]*3) st=time.time() func(arr) print(f'"w/o_jit" elapsed_time {time.time()-st:2f}') st=time.time() func_jit(arr) print(f'"jit + w/o type sepc elapsed_time {time.time()-st:2f}') st=time.time() func_jit2(arr) print(f'"jit + type spec" elapsed_time {time.time()-st:2f}') st=time.time() obj1=class_jit(arr) obj1.func() print(f'"class jit " elapsed_time {time.time()-st:2f}') st=time.time() obj2=class_jit2() obj2.func(arr) print(f'"class jit staticmethod " elapsed_time {time.time()-st:2f}') "w/o_jit" elapsed_time 3.964147 "jit + w/o type sepc elapsed_time 0.163591 "jit + type spec" elapsed_time 0.047845 "class jit " elapsed_time 0.431932 "class jit staticmethod " elapsed_time 0.043882 @jitつけるだけで24倍 型指定すると83倍の高速化 (jitclass の速度がいまいちなのは謎。jitclassの型指定がうまくいってない...?)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Python】整数を16進数に変えるプログラム!

 前回、整数を2進数に変えるプログラムを作成しました。その時の反省点も踏まえつつ、今回は整数を16進数に変えるプログラムを作ってみました。 def cal_hexa(num): nums = ['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'] hexa = "" while num: remainder = num % 16 hexa = nums[remainder] + hexa num //= 16 return hexa num = int(input("整数を入力してください:")) result = cal_hexa(num) print(result) #Python標準機能の場合 print(hex(num))  出力結果は以下のようになります。 整数を入力してください:7770 1E5A 0x1e5a (Python標準機能の場合)  前回は、余りをString型に変えて、配列に入れて、「reverse」で逆順にして、「join」でさらに結合させるという回りくどいやり方をしてしまったので、その辺を修正しました。  その際に、さまざまなご意見をいただきましたが、自分の中でまだ理解しきれていないやり方は使っていません。これから理解を深めていきます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PythonでXGBoost

公式 pandas型で説明変数/被説明変数、学習/テスト、データを用意する。 x_train, y_train x_valid, y_valid モデルを作成して予測値を計算する。 import pandas as pd import xgboost as xgb dtrain = xgb.DMatrix(x_train,y_train) dvalid = xgb.DMatrix(x_valid,y_valid) params = { "objective" : "reg:squarederror", "eval_metric" : "rmse" } model = xgb.train( params = params, dtrain = dtrain, evals = [(dtrain, "train"), (dvalid, "valid")], num_boost_round = 100 ) pred = model.predict(xgb.DMatrix(x_valid)) プロットする。 import matplotlib.pyplot as plt import numpy as np plt.scatter(y_valid, pred, alpha = 0.5) plt.plot(np.linspace(0, 200, 400), np.linspace(0, 200, 400), "red") plt.show() 誤差を調べる。 from sklearn.metrics import mean_squared_error mse = mean_squared_error(y_valid, pred) rmse = np.sqrt(mse) print(rmse)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

RGB to RAW(Bayer)変換の解説

RGB to RAW変換概要 初めに RGBをRAWのデータに変換する方法として、RGBデータを間引く方法を説明します。 今回は例として256x256x3のRGBデータを128 x 128 x 4のRAWデータに変換するものを図として以下に示します。 ※一般的なベイヤ配列を想定していますので、ダブルベイヤやクアッドベイヤなどの説明は省かせていただきます。 データサイズは $ RGB = [h , w , 3 ] → RAW = [h/2 , w/2 , 4]$ となります。 また、RAWをベイヤ形式に並べると $ Bayer = [h,w, 1] $ となります。 前述したとおり、データを間引くだけの単純な処理となるが、$G$チャネルと残りの $R,B$チャネルで少しだけ処理が違うことに注意する。 $G$チャネルはRAWに変換する際に奇数行と偶数行で分けて処理をしますが、最終的なベイヤ配列にする際に$R$チャネルと隣り合うものを$Gr$,$B$チャネルと隣り合うものを$Gb$とします。 R RAW_R= \left( \begin{align} & R_{0,0} & R_{0,2} & &\cdots & & R_{0,even} && \cdots & & R_{0,254} \\ & R_{2,0} & R_{2,2} & &\cdots && R_{2,even} & & \cdots && R_{2,254} \\ & \vdots & & & && && & & \vdots \\ & R_{252,0} & R_{252,2} & & \cdots & & R_{252,even}& & \cdots & & R_{252,254} \\ &R_{254,0} & R_{254,2} & &\cdots && R_{254,even} && \cdots && R_{254,254} \\ \end{align} \right) のように、偶数行の偶数列を抽出してRAWデータのRチャネルとします。 B RAW_B= \left( \begin{align} & R_{1,1} & R_{1,3} & &\cdots & & R_{1,odd} && \cdots & & R_{1,255} \\ & R_{3,1} & R_{3,3} & &\cdots && R_{3,odd} & & \cdots && R_{3,255} \\ & \vdots & & & && && & & \vdots \\ & R_{253,1} & R_{253,3} & & \cdots & & R_{253,odd}& & \cdots & & R_{253,255} \\ &R_{255,1} & R_{255,5} & &\cdots && R_{255,odd} && \cdots && R_{255,255} \\ \end{align} \right) $R$の時の逆で、$B$は奇数行の奇数列を抽出します。 G $G$チャネルはベイヤ配列にする際に$R,B$と隣り合うものをそれぞれ$G_r,G_b$として抽出します。 $RAW_{G_r} = G_{even,odd}$ $RAW_{G_b} = G_{odd,even}$ ベイヤ配列 Bayer Array 上の処理で得られたRAWデータを並べ替えることによってベイヤ配列が得られる。 $ RGB = [256 , 256 , 3] → Bayer = [256 , 256 ,1 ] $ という感じにサイズが変わります。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

python指定フォルダ内のサブフォルダにあるファイルを別のフォルダに移動する

以下のフォルダ内に複数サブフォルダがあり、サブフォルダ内のmp4ファイルを G:/folder/ ├── folder1 │  └── file2.mp4 └── folder2     ├── file3.mp4     └── file4.mp4 以下のフォルダのように移動するプログラムです。 G:/move_folder/ ├── file2.mp4 ├── file3.mp4 └── file4.mp4 絶対パスで指定できます。 move_folder.py #指定フォルダの下にあるサブフォルダ内のmp4ファイルを指定フォルダに移動 import os import glob from pathlib import Path import shutil #パスは/に変更 dir_path = Path("G:/folder/")#サブフォルダがあるフォルダ move_path = "G:/move_folder/"#ファイルを移動するフォルダ #サブフォルダをリストにする subfolder_list = dir_path.iterdir() #ファイルを移動 for subfolder in subfolder_list: #サブフォルダがあった場合 if subfolder.is_dir(): #サブフォルダ内のmp4ファイルをリストにする subfolder_file_list = list(subfolder.glob("*.mp4")) #mp4ファイルを指定フォルダに移動する for move_file in subfolder_file_list: print(move_file)#移動するファイル new_path = shutil.move(move_file, move_path)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

python初学者の備忘録 ①型について

データ型とは 基本 int型(整数型) 例:「1」「-5」など float型(浮動小数型) 例:「0.1」 str型(文字列型) 例:「あ」 bool型(ブール型) 例:「True」「False」 型を調べる type関数:型を返す type.py number = 1 number2 = 1.0 greeting = 'こんにちは' または "こんにちは" is_ok = True print(number,type(number)) print(number2 ,type(number)) print(greeting ,type(number)) print(is_ok ,type(number)) # -- 実行結果 -- # 1 <class 'int'> # 1.0 <class 'float'> # こんにちは <class 'str'> # True <class 'bool'> # 不等式 print(2 > 1) print(2 < 1) # -- 実行結果 -- # True # False
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

python初学者の備忘録 ②数値型について

数値型とは 基本 int型とfloat型の2つからなる 以下の演算子を使うことが可能 記号 計算 +a 整数 -a 負数 + 足し算 - 引き算 * 掛け算 / 割り算 % 割ったあまり ** べき乗 // 割り算(切り捨て) 演算子の優先順位 「+a」,「-a」>「**」>「*」,「/」 > 「//」>「%」>「+」,「-」 ・int関数:数値型に変換する ・str関数:文字列型に変換する ・bool関数:ブール型に変換する ・round関数:偶数への丸め >>> 5 / 3 #>>> 1.66666666666666667 >>> 5 % 3 #>>> 2 >>> 5 * 5 * 5 * 5 * 5 * 5 または >>> 5 ** 6 #>>> 15625 # int型とfloat型で計算した場合float型になる >>> 3 + 2.0 #>>> 5.0 >>> 5 - 2.3 #>>> 2.7 # int型になる >>> int(2.7) #>>> 2 # str型になる >>> str(2.7) #>>> '2.7' # 0以外はTrueになる >>> bool(1) #>>> True >>> bool(0) #>>> False # 第二引数がない場合は整数を返す # 以下の通り想定通りの四捨五入値にならない >>> round(0.5) #>>> 0 >>> round(1.5) #>>> 2 >>> round(2.5) #>>> 2 >>> round(3.5) #>>> 4 >>> round(4.5) #>>> 4 int型とfloat型で計算した場合float型になる 組み込み関数のroundは一般的な四捨五入ではなく、偶数への丸めなので注意 ※端数が0.5より小さいなら切り捨て、端数が0.5より大きいならは切り上げ、端数がちょうど0.5なら切り捨てと切り上げのうち結果が偶数となる方へ丸める ※正しい四捨五入は別項で
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

python初学者の備忘録 ③文字列型について

文字列型とは 基本 シングルクォーテーションまたはダブルクォーテーションで囲む >>> print('おはよう') >>> print("おはよう") #>>> おはよう 「¥n」「”””」で改行 改行例 >>> print('おはよう\nこんにちは\nこんばんは') または >>> print("""おはよう こんにちは こんばんは""") #>>> おはよう # こんにちは # こんばんは コード内での改行例 Greeting = ('おはよう' 'こんにちは') または Greeting = 'おはよう'\ 'こんにちは' print(Greeting) # -- 実行結果 -- # おはようこんにちは #出力結果は改行されない シングルコート、ダブルコートなどのエスケープ #シングルコートの手前に\を入れる >>> print('I can\'t speak English') または #ダブルコートで囲む >>> print("I can't speak English") #>>> I can't speak English #ダブルコートをエスケープする場合も同様 >>> print('例"I can\'t speak English"') #>>> 例"I can't speak English" 改行コードをエスケープする # 文字列の前にr(raw)を入れる >>> print(r'C\name\name') または # \を\でエスケープする >>> print('C\\name\\name') #>>> C\name\name 数値型と同様に「+」「*」で文字列の連結や繰り返しが可能 >>> print('おはよう' + 'こんにちは') #>>> おはようこんにちは >>> print('おはよう' * 6) #>>> おはようおはようおはようおはようおはようおはよう -- 文字列インデックス -- インデックスは0から始まる >>> 'Minnie' #>>> 'Minnie' >>> 'Minnie'[0] #>>> 'M' >>> 'Minnie'[1] #>>> 'i' >>> 'Minnie'[2] #>>> 'n' >>> 'Minnie'[3] #>>> 'n' >>> 'Minnie'[4] #>>> 'e' >>> 'Minnie'[5] # 4番目の文字は無いためエラー # -は最後から数えた文字数 >>> 'Minnie'[-1] #>>> 'e' >>> 'Minnie'[-2] #>>> 'n' >>> 'Minnie'[-3] #>>> 'n' >>> 'Minnie'[-4] #>>> 'i' >>> 'Minnie'[-5] #>>> 'M' -- 文字列のスライス -- >>> 'English'[2:5] #>>> 'gli' 3文字目から6文字目まで >>> 'English'[2:] #>>> 'glish' 3文字目から最後まで >>> 'English'[:4] #>>> 'Engl' 4文字目まで >>> 'English'[0:7:2] #>>> 'Engl' 1文字目から7文字目までを2文字飛ばしで -- 文字型の関数、メソッド -- len関数:文字長を返す >>> len('English') #>>> 7 countメソッド:指定した文字列が文字列に含まれている数を返す >>> 'Junior High School'.count('o') #>>> 2 startswithメソッド:文字列の始まりが指定した文字列と一致しているかboolで返す >>> 'Junior High School'.startswith('Ju') #>>> True >>> 'Junior High School'.startswith('Jum') #>>> False findメソッド : 指定した文字列が何文字目から開始されるか返す >>> 'Junior High School/Hi School'.find('Hi') #>>> 7 rfindメソッド : 指定した文字列が後ろから数えて、前から何文字目から開始されるか返す >>> 'Junior High School/Hi School'.rfind('Hi') #>>> 19
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

pycharmでインスペクション(値の評価)

方法 ソースコード内で評価したい箇所を選択して右クリック、式の評価で見ることができる
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【3】python キャスト(授業資料3 演習)

演習問題 値「123」と値「'123'」の違いを説明してください. 「'123' + '123'」の結果がどうなるか確認し、キャストを使って結果が246になるように式を変更してください. 解き終わり次第,まなBOXにて提出しましょう.演習の提出状況で成績判断をします. →次の演習へ 演習問題一覧はこちら 引用 Amazon: たった1日で基本が身に付く! Python超入門 1日で基本が身につく! Python超入門 - Speaker Deck →こちらのなかのキャストに関する演習問題を取りあげました.Python3初学者限らずコーディング初心者にとっても「正確で」「理解しやすい言葉を用いた」資料だと言えます.是非参照して下さい.
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Python三次元ポアソン方程式による静電場解析 (1)点電荷の電場解析

1. はじめに 二次元ポアッソン方程式による電場解析例(1)はQiitaにおいても紹介されているが,電場解析に必要な三次元の例はなかったので,トライしてみた. 本稿では,下記を実施する. (1)三次元ポアソン方程式を離散化 (2)繰り返し法によるプログラムを作成. ①メッシュ幅は1.0と0.5を選択できるようにする. ②電位を計算 ③得られた電位から電場を計算 (3)計算結果を理論値と比較することにより解析の妥当性を検証 なお,今後帯電した円盤,球について報告したいと考えています. 2. 例題の問題設定 各軸のメッシュ数は50とし,中心点(25,25,25)に点電荷を配置する. 図1 問題設定-点電荷の配置 3. ポアソン方程式の離散化 下記に手順を記す.  ここで注意が必要な点はρは電荷密度であることである. 4. プログラム import pprint from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt import numpy as np import matplotlib.cm as cm delta_L=0.5 # delta_L=1.0 LN=50 HLN=int(LN/2) nx = LN ny = LN nz = LN xmin = 0 xmax = LN*delta_L ymin = 0 ymax = LN*delta_L zmin = 0 zmax = LN*delta_L p = np.zeros((nz, ny, nx)) pd = np.zeros((nz, ny, nx)) charge = np.zeros((nz, ny, nx)) x = np.linspace(xmin, xmax, nx) y = np.linspace(ymin, ymax, ny) z = np.linspace(zmin, zmax, nz) eps0=1  # とりあえず y00=1 Q=1 q=Q/delta_L**3 # 電荷密度に変換 charge[HLN][HLN][HLN]=q for I in range(500): #2000 # 大きくすると精度は上がるが時間がかかる pd = p.copy() p[1:-1,1:-1,1:-1] = (pd[2:,1:-1,1:-1] + pd[:-2,1:-1,1:-1] + pd[1:-1,2:,1:-1] + pd[1:-1,:-2,1:-1] + pd[1:-1,1:-1,2:] + pd[1:-1,1:-1,:-2] + (delta_L**2)*charge[1:-1, 1:-1, 1:-1]/eps0) /6 p[0][:][:]=0 p[nx-1][:][:]=0 p[:][0][:]=0 p[:][ny-1][:]=0 p[:][:][0]=0 p[:][:][nz-1]=0 def plot2D(x, y, p): fig = plt.figure(figsize=(11, 7), dpi=100) ax = fig.gca(projection='3d') X, Y = np.meshgrid(x, y) surf = ax.plot_surface(X, Y, p[:], rstride=1, cstride=1, cmap=cm.viridis,linewidth=0, antialiased=False) ax.view_init(30, 225) ax.set_xlabel('x') ax.set_ylabel('y') ax.set_zlabel('p') plot2D(x,y,p[:,:,HLN]) def plot_surface(pp): nx = LN ny = LN fig = plt.figure(figsize=(11,7), dpi=100) fig xmin = 0 xmax = LN-1 ymin = 0 ymax = LN-1 x = np.linspace(xmin, xmax, nx) y = np.linspace(ymin, ymax, ny) X, Y = np.meshgrid(x, y) plt.contourf(X, Y, pp, alpha=0.1, cmap=cm.viridis) plt.colorbar() plt.xlabel('X') plt.ylabel('Y') plot_surface(p[:,:,HLN]) plt.style.use('ggplot') plt.rcParams["axes.facecolor"] = 'white' fig = plt.figure() ax = fig.gca(projection='3d') L=5 NLS=HLN-2#25 NLY=5 X, Y, Z= np.meshgrid(np.arange(0, L,1), np.arange(0, L,1), np.arange(0, NLY,1)) Ex = np.zeros([L,L,abs(NLY)]) Ey = np.zeros([L,L,abs(NLY)]) Ez = np.zeros([L,L,abs(NLY)]) for i in range(L): for j in range(L): for k in range(0,NLY): ii=i+HLN-2 jj=j+HLN-2 kk=k+HLN-2 Ex[i,j,k]=-(p[ii,jj+1,kk]-p[ii,jj-1,kk])/2/delta_L Ey[i,j,k]=-(p[ii+1,jj,kk]-p[ii-1,jj,kk])/2/delta_L Ez[i,j,k]=-(p[ii,jj,kk+1]-p[ii,jj,kk-1])/2/delta_L # 電位の理論値計算,表示 print("Riron Keisan V=") for y00 in range(1,5): x2=1/(4*3.14)/(y00*delta_L) print('z=',y00*delta_L+25,' V=',x2) # 電位の計算結果表示 print("V=") for i in range(26,33): print('z=',25+(i-25)*delta_L,' V=',p[HLN,HLN,HLN+(i-25)]) # 電場の理論値計算,表示 print("Riron Keisan E=") for y00 in range(1,6): x2=1/(4*3.14)/(y00*delta_L)**2 print('z=',y00*delta_L+25,' E=',x2) # 電場の計算結果表示 i=25 j=25 for k in range(26,31): print("E=",25+(k-25)*delta_L,"-> ",-(p[i,j,k+1]-p[i,j,k-1])/2/delta_L) ax.quiver(X,Y,Z, Ex, Ey, Ez, color='red',length=6.0*delta_L**2, normalize=False) X1,Y1, Z1=2,2,2 ax.scatter3D(X1,Y1,Z1,"o", color='blue') X1,Y1, Z1=3,2,2 ax.scatter3D(X1,Y1,Z1,"o", color='blue') X1,Y1, Z1=4,2,2 ax.scatter3D(X1,Y1,Z1,"o", color='blue') # plt.grid() plt.draw() plt.show() 5. 計算結果 5.1 delta_T=1.0の場合  図2(a)にz=25面の電位分布の2Dプロット図を,図2(b)に電荷点(25,25,25)を中心とした電場図を示す. 図2(a)電位分布                図2(b)電場 5.2 delta_T=0.5の場合 同様に,図3(a)にz=25面の電位分布の2Dプロット図を,図3(b)に電荷点(25,25,25)を中心とした電場図を示す. 電場図は全く同一に表されている.詳細は次章で説明するが本来なら4倍になるはずであるが,描画プログラムの中で電場ベクトルの長さを1/4にしているためである.   ax.quiver(X,Y,Z, Ex, Ey, Ez, color='red',length=6.0*delta_L**2, normalize=False) 図3(a)電位分布                図3(b)電場 6. 解析の妥当性検証 点電荷周りの電位,電場は理論的に下式で計算できる. 表1にdelta_L=1.0の場合の電位,電場の理論値と計算値の比較を示す. 表2にdelta_L=0.5の場合の電位,電場の理論値と計算値の比較を示す. いずれの場合も,計算値は理論値にほぼ一致している. また,delta_L=0.5の場合,電荷からの距離は1/2となるので,上記計算式で分かるように,電位は2倍,電場は4倍となっている. 表1 delta_L=1.0の場合の電位,電場の理論値と計算値の比較 表2 delta_L=0.5の場合の電位,電場の理論値と計算値の比較 参考文献 (1)[Pythonによる科学・技術計算] 静電位に対する2次元ラプラス・ポアソン方程式のヤコビ法による数値解法,楕円型偏微分方程式,境界値問題
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【2】複合代入演算子を用いた四則演算(授業資料3 演習)

変数numに3を代入し,複合代入演算子を用いて, まずnumに16789769を足し, 次にnumから823639を引き, 次にnumに4927492を掛け, 最後にnumを2で割り, 計算過程と解をスクリーンショットし,まなBOXにて提出しましょう. 参考 Amazon: たった1日で基本が身に付く! Python超入門 1日で基本が身につく! Python超入門 - Speaker Deck
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【高等学校 情報Ⅰ,Ⅱ】 授業シラバス

本来,高等学校情報科で授業展開する内容 タイトル 学習内容 序章:情報社会に生きるわたしたち ※オリエンテーション的な位置づけの章です。 情報社会と情報の科学 学習に入る前に「チェックリスト」など <ネットワーク編> 第1章:コンピュータによる情報の処理と表現 ※コンピュータの計算のしくみと情報のディジタル化について解説した章です。 コンピュータの動作のしくみ CPUと論理回路 コンピュータにおける数値、文字、音、画像の表現 圧縮のしくみなど 第2章:ネットワークがつなぐコミュニケーション ※コンピュータネットワークのしくみの解説を中心とした章です ネットワークの構成要素 プロトコル インターネットのしくみなど 第3章:情報システムが支える社会 ※情報システムが社会を支える重要な基盤となっていること、またその安全性を守るためのセキュリティについて法的な側面も含めて解説した章です。 情報システムを支えるしくみ ネットワークを利用した犯罪 情報セキュリティ技術 暗号化と認証技術 技術・文化の発展と知的財産権など <問題解決編> アカデミック・スキルズ ※問題解決の基本的な流れを学び、また、統計的手法を含めた問題解決のさまざまな手法を学ぶ章です。 問題解決とは 情報収集と調査 データの統計的分析など 第4章:問題の解決と処理手順の自動化 ※アルゴリズムとプログラミングについて学ぶ章です。例題形式で展開しています。また、JavaScriptと VBAを併記しました。 アルゴリズムとフローチャート アルゴリズムの基本構造とプログラム アルゴリズムの比較など 第5章:モデル化と問題解決 ※モデル化とシミュレーション及び、データベースについて学ぶ章です。第4章同様、例題形式で展開しています。 モデル化と問題解決 確率的に変化する現象のモデル化とシミュレーション データベース リレーショナルデータベースの作成 [コラム]ビッグデータとNoSQLなど 第6章:情報通信ネットワークと問題解決 ※グループで取り組む問題解決のテーマを紹介した章です。 身近な地域マップ 統計的手法とグラフ メディアの情報をチェックする 会議の企画など 参考資料 カリキュラム編成 【日本文教出版】令和3年度 教科書「新・情報の科学」 【日本文教出版】高等学校「情報科」教科書 ダイジェスト版 【文部科学省】高等学校情報科「情報Ⅰ」教員研修用教材(本編) 【文部科学省】高等学校情報科「情報Ⅱ」教員研修用教材(本編) 学術的な内容 情報 第2版: 東京大学教養学部テキスト Pythonによるプログラミング入門 東京大学教養学部テキスト: アルゴリズムと情報科学の基礎を学ぶ 教養としてのコンピューターサイエンス講義 今こそ知っておくべき「デジタル世界」の基礎知識
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【高等学校 情報Ⅰ,Ⅱ】 授業シラバス(WIP)

本来,高等学校情報科で授業展開する内容 タイトル 学習内容 序章:情報社会に生きるわたしたち ※オリエンテーション的な位置づけの章です。 情報社会と情報の科学 学習に入る前に「チェックリスト」など <ネットワーク編> 第1章:コンピュータによる情報の処理と表現 ※コンピュータの計算のしくみと情報のディジタル化について解説した章です。 コンピュータの動作のしくみ CPUと論理回路 コンピュータにおける数値、文字、音、画像の表現 圧縮のしくみなど 第2章:ネットワークがつなぐコミュニケーション ※コンピュータネットワークのしくみの解説を中心とした章です ネットワークの構成要素 プロトコル インターネットのしくみなど 第3章:情報システムが支える社会 ※情報システムが社会を支える重要な基盤となっていること、またその安全性を守るためのセキュリティについて法的な側面も含めて解説した章です。 情報システムを支えるしくみ ネットワークを利用した犯罪 情報セキュリティ技術 暗号化と認証技術 技術・文化の発展と知的財産権など <問題解決編> アカデミック・スキルズ ※問題解決の基本的な流れを学び、また、統計的手法を含めた問題解決のさまざまな手法を学ぶ章です。 問題解決とは 情報収集と調査 データの統計的分析など 第4章:問題の解決と処理手順の自動化 ※アルゴリズムとプログラミングについて学ぶ章です。例題形式で展開しています。また、JavaScriptと VBAを併記しました。 アルゴリズムとフローチャート アルゴリズムの基本構造とプログラム アルゴリズムの比較など 第5章:モデル化と問題解決 ※モデル化とシミュレーション及び、データベースについて学ぶ章です。第4章同様、例題形式で展開しています。 モデル化と問題解決 確率的に変化する現象のモデル化とシミュレーション データベース リレーショナルデータベースの作成 [コラム]ビッグデータとNoSQLなど 第6章:情報通信ネットワークと問題解決 ※グループで取り組む問題解決のテーマを紹介した章です。 身近な地域マップ 統計的手法とグラフ メディアの情報をチェックする 会議の企画など 参考資料 カリキュラム編成 【日本文教出版】令和3年度 教科書「新・情報の科学」 【日本文教出版】高等学校「情報科」教科書 ダイジェスト版 【文部科学省】高等学校情報科「情報Ⅰ」教員研修用教材(本編) 【文部科学省】高等学校情報科「情報Ⅱ」教員研修用教材(本編) 学術的な内容 情報 第2版: 東京大学教養学部テキスト Pythonによるプログラミング入門 東京大学教養学部テキスト: アルゴリズムと情報科学の基礎を学ぶ 教養としてのコンピューターサイエンス講義 今こそ知っておくべき「デジタル世界」の基礎知識
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【1】計算してみよう(授業資料1 演習)

授業にて.python3で小学生レベルの計算(四則演算,累乗,剰余)について扱いました.以下の式をコマンドで実行し,スクリーンショットをまなBOXにて提出しましょう. 111×113の積 6782÷395の商(小数で構わない) 3689469÷86736の剰余(余り) 45の6乗 ヒント: pythonもしくはpython3というコマンドを実行すると計算ができるようになります(>>>が表示) →次の演習へ
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【演習1】計算してみよう(授業資料1 演習)

授業にて.python3で小学生レベルの計算(四則演算,累乗,剰余)について扱いました.以下の式をコマンドで実行し,スクリーンショットをまなBOXにて提出しましょう. 111×113の積 6782÷395の商(小数で構わない) 3689469÷86736の剰余(余り) 45の6乗 ヒント: pythonもしくはpython3というコマンドを実行すると計算ができるようになります(>>>が表示) →次の演習へ
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

# 毎月壁紙を自動で変えたい!その2

毎月壁紙を自動で変えたい!その2 前回の記事で毎月自動で壁紙を変えるプログラムを作ってみたのですが、PCを再起動すると壁紙がリセットされてしまったので、いろいろ試行錯誤してみました。 改善点 プログラムを毎日実行すると毎日壁紙ダウンロードすることになり、それはちょっとナンセンスだと思うのでif文を使って条件分岐してみました。 また、python環境が無くても動くようにexe形式に変換して動かすことにしました。 条件分岐 if文を使って、指定された格納先に「wallpaper_yyyymm_1.jpg」というファイルがないかを判定。 プログラム実施月の画像ファイルがない場合は、壁紙をダウンロードします。 まず、実施日の日付を取得し、ファイル名を作成します。これは前回と同じです。 #--- import Today's date --- dt_now = datetime.datetime.now() print(dt_now.strftime('%Y/%m/%d')) #--- path make --- dst_path = r'C:\Users\ayk_f\wallpaper\wallpaper_'+dt_now.strftime('%Y%m')+'_1.jpg' wname = 'wallpaper_'+dt_now.strftime('%Y%m')+'_1.jpg' print('path: '+dst_path) $ python wallpaper_v2.py 2021/09/13 path: C:\Users\ayk_f\wallpaper\wallpaper_202109_1.jpg ファイル名が作れたので該当するファイル名がないかを判定し、ない場合のみ壁紙をダウンロードします。 is_file = os. path.isfile(dst_path) print(is_file) if is_file: print(f"{wname} is a file.") pass #なにもしない else: print(f"{wname} is a not file.") os. path.isfile()関数は、指定したファイル名が存在する場合にTrueを返す、という関数らしいです。 今回は「指定したディレクトリに wallpaper_202109_1.jpg が存在する場合はなにもしない、存在しない場合はダウンロードする」ということになります。 passは、条件分岐の結果何もしない場合に入れておく必要があります。 今回は試験的にprintを実行していますが、実際はコメントアウトするためpassを入れています。 参考までに 今月の壁紙(wallpaper_202109_1.jpg)があるとき~~~!!! $ python wallpaper_v2.0.py 2021/09/13 path: C:\Users\ayk_f\wallpaper\wallpaper_202109_1.jpg True ないとき~~~~ $ python wallpaper_v2.0.py 2021/09/13 path: C:\Users\ayk_f\wallpaper\wallpaper_202109_1.jpg False このネタがやりたかっただけ・・・・(笑) ないときに壁紙をダウンロードするコードを実行し、最後に壁紙を設定するコードを実行すれば完成です。 壁紙の設定は再起動時にリセットされてしまうので、if文の外に出しておく必要があります。 コードのexeファイル化 この記事の通りにやりました。 参考までに、記録しておきます。 1. pyinstallerをインストール Pythonをインストールしている状態で、pyinstallerをインストールします。 $ pip install pyinstaller 2. exeファイル作成 インストールが完了したら、exe形式のファイルを作成します。 $ pyinstaller wallpaper_v2.0.py --onefile --onefileオプションは、関連ファイルを1つにまとめてくれるとのこと。省略可能です。 実行後、3つのフォルダとspec形式のファイルができました。 distフォルダの中に、作成したexe形式のファイルが作成されています。 これで、exe形式に変換できました! さいごに 前回投稿したコードの改版についてでした。 折角exe化したので、タスクスケジューラをやめてwindowsのスタートアップにほおりこんでおくことにしました。 毎日PC立ち上げたタイミングで実行してくれるので、もうこれで安心のはず・・・。 参考サイト Python でファイルの存在確認をする - Python入門 Pythonのファイルをexe化する方法【初心者向け】 - TechAcademyマガジン Pythonのpass文の意味と使い方 - note.nkmk.me
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

prophet で株価予測メモ

FB社が公開している時系列予測ツール prophet を使うと、今後の株価の動きが予測できるそうです。使い方のメモ。 Google Colaboratoryで実行できます。 インストルール !pip install prophet 株価データの準備 stooq から取得 import pandas_datareader.data as pdr df = pdr.DataReader("{}.JP".format(2929), "stooq").sort_index() df.tail() 分析用に加工 prophet で分析するために ds:日付, y:終値のカラムを設ける df["ds"] = df.index df = df.rename(columns={'Close': 'y'}) df.tail() 分析実行 from prophet import Prophet m = Prophet() m.fit(df) future = m.make_future_dataframe(periods=365) forecast = m.predict(future) fig = m.plot(forecast) 2021-09-10 以降のグラフが予想結果
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

初学者がPythonについてまとめる

はじめに プログラミング初学者が自分なりにPythonについてまとめてみた。 もし間違っていることを書いているようならご指摘いただけると幸いです。 Pythonとは Pythonはオブジェクト指向プログラミング言語と呼ばれており、少ないコードで簡潔にプログラムを書ける。 公式ドキュメント Pythonでできること AI(機械学習・深層学習) Webサイト作成 ゲーム制作 Web上の情報収集ツール(スクレイピング) データ処理・分析・解析 使用例 公式サイトから引用 YouTube "Python is fast enough for our site and allows us to produce maintainable features in record times, with a minimum of developers," said Cuong Do, Software Architect, YouTube.com. Google "Python has been an important part of Google since the beginning, and remains so as the system grows and evolves. Today dozens of Google engineers use Python, and we're looking for more people with skills in this language." said Peter Norvig, director of search quality at Google, Inc. オブジェクトとクラス オブジェクトとは、データだけでなく、振る舞い(メソッド)を含み、クラスを定義することによって生成できるもののことである。 クラスではオブジェクトを作成する際のデータやメソッドを定義する。 classとは、クラスを定義する際のキーワード(予約語)である。 クラスもオブジェクトの一種で(pythonはすべてオブジェクト)、クラスから生成したオブジェクトを特別に区別するためにインスタンスと呼んでいる。 class.py class SchoolMember: def __init__(self, classes, name, number): self.classes = classes self.name = name self.number = number 基本的なクラス定義の仕方はclassの後にクラス名を指定し、def ~~で関数(メソッド)を記述する。 この時、クラス名は大文字から始める。 コンストラクタは、__init__という名前で定義するのがルールである。 コンストラクタはオブジェクト生成時に最初に実行される、初期化用の関数のことである。 コンストラクタの第一引数はselfとし、selfはインスタンス自身を指す。 instance.py # インスタンス生成 school_member1 = SchoolMember(1, 'Taro', 10) # インスタンスの参照(instance).(member) print(school_member1.classes) # 1 print(school_member1.name) # Taro print(school_member1.number) # 10 # memberの書き換えも可能 school_member1.classes = 2 print(school_member1.classes) # 2 クラス内で定義された変数のことをmemberと呼び、今回だとclasses、name、numberである。 クラスの継承 親クラスの機能をそのまま引き継いだ子クラスをクラスの継承と呼ぶ。 クラスの継承には既存のクラスが必要であり、既存のクラスに機能を追加したいときにクラスの継承を行うことで既存クラスに直接書き加えることなくメソッドなどの追加ができる。 クラスの継承元は親クラスやスーパークラスなどと呼ばれ、継承先のクラスを子クラスや派生クラスなどと呼ばれる。 簡単なクラス継承 class_inheritance.py class Game: def __init__(self, name, hardware): self.name = name self.hardware = hardware # 継承先(子クラス)の生成 class GameChild(Game): def __init__(self, name, hardware, category): self.name = name self.hardware = hardware self.category = category game1_data = GameChild('Apex', 'PC', 'FPS') print(game1_data.name) # Apex super()を使ったクラス継承 class_super_inheritance.py class Game: def __init__(self, name, hardware): self.name = name self.hardware = hardware class GameChild(Game): def __init__(self, name, hardware, category): # 親クラスのコンストラクタの呼び出し super(GameChild, self).__init__(name, hardware) self.category = category game1_data = GameChild('VALORANT', 'PC', 'FPS') print(game1_data.name) # VALORANT メソッド メソッドとは、クラス内で定義された関数やオブジェクトの属性として参照される関数などのことである。 method.py class Friend: def __init__(self, year, sex, height, weight): self.year = yaer self.sex = sex self.height = height self.weight = weight def calculation_BMI(self): bmi = round(self.weight / ((self.height / 100) ** 2)) return bmi friend1_data = Friend(20, 'man', 170, 55) print(friend1_data.calculation_BMI()) 関数とメソッドの違い 呼び出し方の違い 関数: 単独で呼び出しできる メソッド: 変数や値に付けて呼び出す print()、len()などは単独で呼び出せるので関数である。 function.py print("Hello! Taro.") # Hello! Taro. print(len(["dog", "cat", "hamster", "fish"])) # 4 リストに要素を追加するappend()や文字列を繋ぐjoin()は変数や値に付けて呼び出すメソッドである。 変数や値の後にドット(.) + メソッドとすることで呼び出すことができる。 method.py animal_list = ["dog", "cat", "hamster", "fish"] animal_list.append("lion") print(animal_list) # ["dog", "cat", "hamster", "fish", "lion"] animal_list_join = "/".join(animal_list) print(animal_list_join) # dog/cat/hamster/fish/lion ただし、メソッドはデータ型に紐付いた関数のため、呼び出せる種類はデータ型で異なる。 上記の例のappend()はリスト型の変数には使えるが辞書型には使えない。 またどちらでも使えるメソッドpop()などもある。 参考
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Python】macOSのcronでpythonを自動実行してみた

はじめに macOSでPythonのプログラミングを書くようになった後はそれを自動実行させるのが次のステップかなと思います。 今回はcronを使ってpythonを自動実行する方法を記載します。 環境 Python3.9 macOS Catalina10.15.7 方法 1.cronにアクセス権を付与 システム環境設定>セキュリティとプライバシー>プライバシー>フルディスクアクセス の順にクリックします。 次に、鍵マークをクリックして管理者パスワードを入力後、「+」ボタンを押します。 アプリケーションの選択画面で[command] + [shift] + [G]押します。 検索バーに /usr/sbin/cron と入力してcronを追加します。 2.ターミナルを起動 ターミナルを起動します。 Python3のプログラムの場所を[which python3]コマンドで確認します。 % which python3 /Library/Frameworks/Python.framework/Versions/3.9/bin/python3 次に、デスクトップに置いたプログラムの位置を確認します。 右クリックして[情報見る]をクリックし[場所]を選択して[control] + [C]でコピーします。 メモに貼り付けておいて下さい。 メモに貼り付けたら、最後に[/とファイル名]を追加します。 以下の例は「/Mac_SBI_IPO.py」を追記しています。 /Users/hirockio/Desktop/python/Mac_SBI_IPO.py 2.cronに記入 ターミナルをもう一つ開きます。 以下のコマンドを入力します。 % crontab -e 以下の画面が開いたら、i をクリックします。 画面下部が--INSERT--となったら記入できます。 スケジュールの書き方 "分 時 日 月 曜日 /Python3のフルパス /実行したいプログラム" 指定しない場合は * を入れます。 (例)毎朝9時に実行する場合の例 0 9 * * * /Library/Frameworks/Python.framework/Versions/3.9/bin/python3 /Users/hirockio/Desktop/python/Mac_SBI_IPO.py 分 0〜59 時 0〜23 日 1〜31 月 1〜12 曜日 0〜7(0,7=日曜、1=月曜、2=火曜、3=水曜、4=木曜、5=金曜、6=土曜) サンプル 毎朝8:30に実行するなら、30 8 * * * /フルパス /Mac_SBI_IPO.py 毎週水曜の18:45に実行するなら、45 18 * * 3 /フルパス /Mac_SBI_IPO.py 毎月26日の23:00に実行するなら、0 23 26 * * /フルパス /Mac_SBI_IPO.py はまり注意 上記の間は全て半角スペースです。 例えば、/フルパス[ここ]/実行したいプログラム [ここ]に改行してしまうとエラーになって実行されません! Python3.9でデスクトップにあるPythonフォルダ内のMac_SBI_IPO.pyを毎日11時20分に実行するサンプルは以下となります。 必要に応じてコピーしてお使いください。 20 11 * * * /Library/Frameworks/Python.framework/Versions/3.9/bin/python3 /Users/hirokio/Desktop/python/Mac_SBI_IPO.py 貼り付けます。 貼り付け後に「esc」を押しコマンドモードに切り替えてから :wq と入力して、returnキーでcronを保存します。 保存の際に以下のエラーが出た場合は文法が間違っています。 yを押して、半角スペースや書き方をもう一度見直してみて下さい。 crontab: errors in crontab file, can't install Do you want to retry the same edit? 最後に 自動実行できましたでしょうか。 私はこれまで基本Windowユーザで、pythonはWindowsで書いていました。 自動実行には標準でインストールされている「タスクスケジューラ」を利用していました。 まぁこれが前回の実行結果→[0x1]で止まっていることが多いです。。。昨日まで動いていたのに・・・。 その原因追求に工数がかかります。 今のところWindowsよりmacOSの方が安定している印象です。 ご参考になれば幸いです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む