【Python】 for break else の挙動
breakは直後のelseごと破壊します。
for i in range(10): print(i) if i == 5: break else: print("Hi")
実行結果
0 1 2 3 4 5
最後まで、breakされなければ、else以降が実行されます。
for i in range(10): print(i) if i == 15: break else: print("Hi")
実行結果
0 1 2 3 4 5 6 7 8 9 Hi
Pythonでビット演算
AND ・・・ &
OR ・・・ |
XOR ・・・ ^
反転・・・ ~
左シフト・・・<<
右シフト・・・>>
bin(0b1100 & 0b1011) bin(0b1100 | 0b1100) bin(0b1100 ^ 0b1011) bin(~0b1100) bin(0b1100 << 1) bin(0b1100 >> 1)
実行結果
0b1000 0b1100 0b111 -0b1101 0b11000 0b110
format(数字, 'b')
でも2進数表示できますが、この場合は頭の0bがつきません。
メモ用のブログだったことを忘れてました。
更新していこうと思います。
ポアソン分布の覚え方
ポアソン分布の確率関数
これ、なかなか覚えられません。どういう風に解釈すればいいんだろう。
こんなのを見つけた。
ポアソン分布の公式がなかなか覚えれません。なにかウマイ語呂合わせや暗記法を教... - Yahoo!知恵袋
p[0]+p[1]+...+p[n]+...=1とe^λ=1+λ+(1/2)λ^2+...+(1/n!)λ^n+...を比較してみてはどうでしょうか。
それでも不安になったら、2項分布B(N,λ/N)に戻って考え、N→∞としてもよいでしょう。
ふむふむ。
ポアソン分布のすべての確率を足したものと、のテイラー展開を比較せよとな。
左の式は確率なのだから合計1になるでしょう。
右の式もちゃんと書いてみます。のテイラー展開と同じです。
比較ってことは両辺にかけろってことでしょうか。
ほうほう。つまり、こういうことですね。
なるほど。最初のでkに適当に値を入れてみても、確かに対応していることがわかります。
対角化とかで使うP^-1APは何をやっているのか
対角化でとか使うの解説です。
証明したからOKって終わってたり、謎の図で説明とかよくあるんですが、そういうのに納得がいかない人向けです。
例によって正しさは保証しません。定義とは違うことを言い切ってるため結構危険かもしれません。
最初に、そもそも各記号が何を表しているのかを確認しておくと、
・・・表現行列
・・・基底の取り替え行列
です。
表現行列とは何か
表現行列はある基底のもとでの座標を、別のある基底のもとでの座標に変換するような行列です。
上の数式で言うとA(大きさ3×3)が表現行列になります。
そもそも座標っていうのは基底によってとる値が異なります。下にってついてるのは、それぞれの座標が基底がとに関してのものだよってことを強調してます。標準基底によるものではないってことです。
基底の取り替え行列とは何か
基底を取り替えてくれる行列です。そのまんまです。
例えば基底を次のようにすると
基底の取り替え行列は
のP(大きさ3×3)です。
で、このPなんですが真の目的はこういうことをするためにあります。
つまり表現行列と化します。
こういう操作でこの式は出せます。
そして、基底を意識するとこうなります。
この基底の取り替え行列は表現行列として使えば、の元での座標をの元での座標に変えてくれるってことです。
とは何か
再び表現行列を考えてみます。
よく見ると、今回は左辺の座標ベクトルと右辺の座標ベクトルの基底はどっちもになっています。
はそういう条件であらわれます。
ここで基底の取り替え行列
として、左辺と右辺の座標ベクトルを基底の元での座標に書きなおしてみましょうか。
両辺からをかけると・・・
無事、がでました。
つまり、とは表現行列に別の基底の座標を入れて使いたくなったときに、とすると、みごと別の基底の座標が出力されるようにしてくれるものです。
ちなみに、
みたいに左右の基底がことなる表現行列の場合、
みたいな形になります。やってることは同じなので意味はわかると思います。
畳み込みのお話 ~なぜ、あんな式なのか~
唐突に畳み込みの話をします。
まずはこの式を見てもらいます。
すごく・・・意味不明です・・・
これはWikipediaの畳み込み - Wikipediaの説明で一番最初に出てくる式です。
まあ、意味不明なのは置いといてそういう計算があるものだとしましょう。
次にWikipediaの畳み込みの記事のGIFアニメを見てください。
なんか四角いのが左から走ってきてます。
wikipediaの解説によると下が畳み込みの結果みたいです。
じーっと5分くらいみてるとなんとなくわかってきます。
畳み込みの結果がtの関数になってるので、下の三角形の横軸はtだなー
てことは上は軸なんだなー
確かに重なった面積がその瞬間の畳み込みの値になってるんだなーって。
で、もっかい式を見てみます。
あれ? なんか変じゃね?
なんというかこのアニメーションを見る限り直感的にこういう式であってほしいんです。
これならがだんだん右に行くっていうのが分かる気がするけど、畳み込みの式をみたらになってます。
これってわざわざを左右反転させてるってことですよね。今は正方形だから関係ないけど、本当は反転してるってことですよね? 謎過ぎる。
というわけで、テーマはなんで畳み込みは反転させたやつを掛けるのかって話です。
総和の畳み込み
連続の畳み込みを考えても難しそうなので、まずは離散の畳み込みを考えてみます。
wikiによると、畳み込みってこんな定義です。
※勝手にn=0から始めることにしてます。
これは具体的に書くとこんな感じです。
m=0のとき
m=1のとき
m=2のとき
m=3のとき
m=4のとき
要するに足してmになるような2つの自然数の組を集めてきて、それをf,gに入れ、足してるってことですね。
どっかで見たことあるような計算です。
これとか
インテグラルのほうの畳み込みも考えてみる
0.01より下は小さすぎるから無視できることにします。あと負の範囲は考えてません。
t=0のとき
t=0.1のとき
こんな感じのノリでしょう。
次にこんな感じの関数を考えてみます。線が見えてる部分以外は0と思ってください
とっても図が見難くて申し訳ないのですが、言いたいことが伝わるでしょうか。上記の例から掛け合わされる部分は下図のような対応関係にあるはずです。
例えばのとき、を考えるのでが対応しています。
矢印で対応しているところを掛けて足すってことを繰り返しまくればt=0.1の畳み込みが求まるはずです。
もし、この矢印のねじれをとればもっと楽にこの図を書けそうなんですが、どうしたらいいでしょうか。
そうですね。右に0.1平行移動させて反転させれば良さそうです。
この図なら垂直に対応してくれてます。そのまんま掛けたを積分すればt=0.1での畳み込みが求まります。
今はt=0.1でやりましたが、t=0.2のときは0.2右に動かして反転させればOKです。
あとはあらゆるtについて計算(tを増やす。すなわちが右に動いていくたびに同じことする)するだけです。
つまり、これが反転させたやつを掛ける理由です。
最後に断っておきますが、この解釈で正しいかは保障しません。ただ、こんだけグダグダ考えれば、定義を忘れることはないかも
sympyをインストール
sympyはMathematicaみたいに代数計算をしてくれるモジュールです。
中高生に与えてはいけないツールですね。
from sympy import * x, y, z = symbols('x y z') for i in range(5): print(expand((x+y+z)**i))
結果
1 x + y + z x**2 + 2*x*y + 2*x*z + y**2 + 2*y*z + z**2 x**3 + 3*x**2*y + 3*x**2*z + 3*x*y**2 + 6*x*y*z + 3*x*z**2 + y**3 + 3*y**2*z + 3*y*z**2 + z**3 x**4 + 4*x**3*y + 4*x**3*z + 6*x**2*y**2 + 12*x**2*y*z + 6*x**2*z**2 + 4*x*y**3 + 12*x*y**2*z + 12*x*y*z**2 + 4*x*z**3 + y**4 + 4*y**3*z + 6*y**2*z**2 + 4*y*z**3 + z**4
でもまあ今どきの高校生はWolfram Alphaとか使うのかな。
【Windows】いかにしてファイルを隠すか
あなたはちょっとPCを貸してって言われた時困りませんか?
困らずに貸せたら気持ちがいいですよね。
逆に貸し渋ってる人を見ると、見られたくないものがあるんだろうなー
きっとあんなものやこんなものだろうなーと邪推してしまうものです。
やっぱり人には見られたくないファイルはあります。
ただ人に見られる、貸すときもあるので、そんなときのために僕がどうやってファイルを隠してきたかを書きます。
またブックマークや履歴なんかも見られたくないですね。それらについても書きましょう。
1. 見られたくないファイルは外付けHDDやUSBメモリへ
一番てっとり早い方法です。普通はこれで問題ないと思います。ただ僕はUSBをつなぐことやHDDを隠す?のが面倒くさいのであまりすきじゃないです。あとファイルの閲覧するとPC側にファイル名の履歴等が残ったりもしますからね。
Dropbox等、クラウド上で管理するという手もありますが、僕はあまり個人情報をクラウドサービスに預けまくるのが好きじゃないので却下です。
2. 仮想マシンで見られたくないファイルを管理
若干面倒ですが有効な方法です。一時期これが最強だと思ってました。Linuxかなんかの仮想マシンに見られたくないファイル全部ぶち込んで、その中でブラウジングすれば見られたくない情報はすべて隠せます。
もちろん、その気になれば暗号化されてるわけでもないので(たぶん)情報は完全に隠せてるというわけではないと思いますが、他人のPCを一時的に借りるときにそんな失礼なことする人はいないです。
ただやはりいちいち仮想マシンを立ち上げるのが面倒なのと普段使いするには重いのが欠点です。
3. 隠しファイル+隠しフォルダ+Cygwin
現在の僕の方法です。問題は多々あると思いますけど、上記2つの方法に比べて楽なのが良いです。
やり方 (Cygwinインストール済みが前提)
1.見られたくないファイルをまとめます
2. 見られたくないファイルを隠しファイル化
フォルダを右クリック、プロパティから隠しファイル、変更をこのフォルダー、サブフォルダーおよびファイルに対して適用をします
これによってエクスプローラや検索によって見つからないようにします。
3. Cygwinの.bshrcや.zshrcに適当な設定を書く
一番面倒なところですが、これが重要です。
まずエイリアスでopenコマンドを用意します。
alias open='cygstart' alias o='cygstart' alias o.='o .'
僕のopen周りはこんな感じです。面倒なのでoでファイルを開けるようにしてます。ほかにもよく使うのはアルファベット1文字で設定してます。o(スペース).でカレントディレクトリを開きますが、o.と打ち間違えるのでo.で定義しています。
エイリアスを追加しまくります。
alias secret='cd ~/secret/'
こんな風にで移動したいファイル名でcdできるようにしておきます。
alias chrome='open chrome' alias c='open chrome'
Chromeを私的な目的で使う用にする場合こんな感じのエイリアスを用意しておきます。
そしてデスクトップ、ホーム等のChromeという単語の出てくるあらゆるものを削除します。代わりにデスクトップのわかりやすいところにFirefoxでも置いときましょう。
4. Cygwin上から隠しファイルにアクセス
ターミナルからlsをすれば隠しファイルは見ることができるので、そのファイルを
open ファイル名
とかで開けばOKです。
この方法の問題点は勝手にCygwinのターミナルを開いて、人の.bshrcや.zshrcを勝手に覗くような不躾な輩に使わせると一貫の終わりということでしょうか。ただたくさん設定書いとけば大丈夫でしょう。わーたくさん書いてるなーくらいの感想で終わってくれるはずです。
あとはファイルを追加する際、いちいち隠しファイル化するのが面倒ということでしょうか。これはそのうちなんとかしたいですね。隠しフォルダにいれたら自動で隠しファイルにする設定とか無いんでしょうか。
個人的にターミナル上でVimを普段使いしたいのでこの方法はかなり気に入ってます。最初に設定を書くところは面倒ですけど、出来上がったらかなり楽です。
全然関係ないけどCygwin+Pythonの設定
そんなこんなで最近の僕はターミナル上で色々操作しているんですが、一応PythonブログなのでPythonの設定に触れときます。
Cygwin上でPython動かそうとすると、Cygwinに内蔵されてるPythonが動作します。
Python 2.7.5 (default, Oct 2 2013, 22:34:09) [GCC 4.8.1] on cygwin Type "help", "copyright", "credits" or "license" for more information.
こんな感じで。on cygwinってなってますね。
これでどうやってWindowsの方にインストールしたPythonを動かせばいいかちょっと悩みました。
結論を言うと以下のエイリアスを追加すればOKです。
alias py='/cygdrive/c/Python33/python.exe' alias ipy='/cygdrive/c/Python33/Scripts/ipython3.exe qtconsole --pylab' alias pynote='/cygdrive/c/Python33/Scripts/ipython3.exe notebook --pylab inline'
pyでpython33 on windowsが実行できるようになります。
ipyはqtconsoleでのipython、pynoteはipython notebookです。