カテゴリー「学問・資格」の44件の記事

2017年7月12日 (水)

Juliaやってみよう。一日目。GRでプロット。

色々と気になっていたJuliaで遊んでみようのコーナーを思いつきで始めます。

普段はウィンドウズでPython使っているのでウィンドウズ、Pythonユーザー向けに書きます。

まずはなんかPlotしてみたいかな。

まずはJuliaのインストール

右も左も分からないので、まあOfficialからバイナリもってきて遊んでみよう。

https://julialang.org/downloads/

から最新版のウィンドウズ用exeインストーラーを落とせばよいのでしょう。今時は普通は64ビットですね。 執筆時点ではもう0.6リリースなってますね。私は手元に0.5があったので、今日はそのまま使います。

ライブラリのインストール

さて、JuliaにもPlotライブラリが色々とあるようです。どれにしようかな。

plot.lyのJulia版もあるようですが、JSON書くのいやなので、パス。

公式サイトのhttps://julialang.org/downloads/plotting.html

では、PyPlotというそのままな名前のライブラリでmatplotlibをJuliaから呼び出しちゃうという恐ろしいものがあった。うーむ、JupyterがIPython Notebookの時代にそんなデモをみたような。これはPythonを呼びに行っているのでPythonも必須。

せっかくなのでJuliaネイティブなライブラリを試したいので全部C/C+で書いてあるというGRというPlotライブラリを試すことにした。これPythonはもちろん、PyPyでも使えるらしいうえに、matplotlibのバックエンドとしてもつかえて30倍くらい線の描画が速いらしい。すごい。。。

JuliaにはPkgという多分標準ライブラリだと思うけど、パッケージマネージャーがあって、登録されているライブラリはPkg.add()で簡単に導入できるらしい。すごい。PythonもCondaで似たようなことができるけど、Juliaの方が進んでいる。

まずはPkg.status()で、導入されているライブラリを表示してみる。

Juliapkgstatus

ふむ。

それでは、Pkg.add("GR")でGRを導入。

Juliapkgadd

INFO: METADATA is out-of-date — you may not have the latest version of GR INFO: Use `Pkg.update()` to get the latest versions of your packages

へ?METADATAが古い?なんの?Pkg.update()すればいいの?

Juliapkgupdate

おお、PackageマネージャーのMETADATAが古いのですな。最新のGRは0.22.0になっているようです。

なんか裏で色々とcondaが暗躍している模様だが、Pkgの実装はピュアJuliaではないのだろうか。なぞ。

さて、Pkg.installed()としてみると、Pkg.update()がすでに全部アップデートしたようで、GRもバージョンが0.22.0になっている。楽じゃ!condaみたい。

GRで初めてのプロット

Pythonでいうimport分はusingらしいが、importというのもある。違いは調べてもよくわからないが、まあ追々でいいか。GRの公式サイトでもusingだったりimportだったりで、まあどっちでもいいようだ。

あとはPythonのようにplot([0,1,4],[3,2,5])のようにするだけでいいのだそうです。

using GR
plot([0,1,4],[3,2,5])

えい。

でた。

これって、plotはGR.plotと同じだと思うのでusingでもってくるとネームスペースのトップにエイリアスがくるっぽい。

タイトルを追加してみる。今度はGRから始まるネームスペースでやってみる。

GR.title("Yattsuke blog playing with Julia")

シーン・・・。何も起きない。PyPlotならshow()とかdraw()の場面だが、show()だとプロットが死んだ。drawはない。

GRの公式サイトの例だと

GR.updatews()

が正解っぽいが、何も起きない。さて・・・。

plotもう一回すると更新されるが、ドキュメンテーションみてもやっぱりupdatewsで正解っぽいなあ。。

うむ。まあ今回はこの程度で、つぎはIJulia使ってみるメウ。

Juliagrplot

2016年10月 5日 (水)

VirtualBox上のSAS University EditionサーバーにLAN経由でアクセス

昨日書いた記事で、SAS University EditionがサポートしているJupyter notebookサーバーをlocalhostからアクセスしてみました。

どうせなら、デスクトップでサーバーを走らせておいて、LAN経由でノートパソコンでアクセスできたらいいなぁとおもいやってみました。

試行錯誤しましたが、ブリッジモードにして、ポートフォワーディングをしてやればOKのようです。

Sas_bridge

ウィンドウズでVirtualBox Host-Only NetworkとPCの接続アダプター(Local Area ConnectionかWifi)を両方選択して、右クリックすると「ブリッジモードに追加」できます。ブリッジモードにするとNetwork Bridgeのアダプター用に新しいIPが振り分けられるので注意。

その後、

Sas_over_lan

ipconfigでLANのIPv4アドレスをしらべて、VirtualBoxのネットワークアダプター1をNATにしてポートフォワーディングをしてやります。

ぐぐるとHost-only adapterをつかえだの、Bridged adapterをつかえだのばかりあるのですが、私の場合NATで大丈夫でした。NATでもポートフォワーディングするまでだめだったし、ウィンドウズの方で設定したブリッジも外すとダメなので両方とも大事のようです。

同様にSAS Studioも10080をポートフォワーディングしてできるはずですね。

2016年10月 4日 (火)

SAS University EditionでJupyter Notebookしてみる。

昔は大学の研究室でも大金をはたかないと使えなかったSASが、今はSAS University Editionがあって、個人用なら基本部分はタダで使える時代になりました。RとかPythonとかがあるので、時代の流れですね。基本部分しかないのでオラクルとかのdbを直接アクセスとかはできませんが、データがcsvに変換できるならなんでも取ってこれるので、まあ結構使えます。

オフィシャルのアナウンスによると、SAS University Editionは2016年の7月以降のバージョンからはJupyter notebookがついてくるらしいですね。

普通は http://localhost:10080 としてSAS Studioに行きますが、jupyterのサーバーがポート8888を使っているので http://localhost:8888 でアクセスできるはずなんですが、ウィンドウズのVirtualBox上でSAS University Editionのサーバーを走らせるとなんかダメだった。

VirtualBoxのNATのネットワークドライバーのSettingを確認してみるとポートフォワーディングにHTTPとHTTPSしかないのが原因っぽいので追加してみる。

Sasunivnat

Sasportforwarding

一応自分でJupyterのサーバーを使ってPythonでなんかする可能性を考えると18888を8888へ送った方が良いかなと思ったのでそうしてみた。

Sasonjupyter

動いた!

別に特別なことはせずとも、SAS University Editionのサーバーが走っていればJupyterのサーバーもすでに走っているようだ。でもつかってみるとSASってログが冗長だしJupyterにはあんまり向いていない気がする。optionsでログ簡潔にすればいいのかな。

options nosource nonotes;

2015年10月28日 (水)

約80~70%の眠っている毛穴を活性化する薬が本物かもしれない件

Dailymailの記事Have scientists cured baldness? New drug reveals regrowth in mice in ten DAYSが詳しいですが、本日 Science Advancesという雑誌に発表されたコロンビア大学の研究によって、まったく新しい育毛剤が開発される可能性が出てきました。

人間の毛穴の大部分(約80~70%)は一度毛が抜け落ちると休眠期に入ってしまい、しばらく新しい毛を作らない状態になるのだそうです。

その眠っている毛穴をなんとか活性化してやればフサフサになるのも夢ではないかもしれないのですが、いままでそんな都合のいい薬はないわけです。

今回の発見ではアメリカのFDAが別の病気用にすでに認可している2つの薬(ルソリチニブとトファシチニブ)が、実は毛穴を活性化する効果を持っていたということで、人間に使っても安全であることが確認されているので、毛生え薬としての許可もかなり期待できます。どちらの薬も円形脱毛症の原因となる自己免疫疾患の薬としていままさに臨床試験をしている途中らしいです。FDAの認可も遠くないように見えます。

ルソリチニブ ruxolitinib(Incyteとノバルティス ファーマ)という薬は血液の病気に使われて、トファシチニブ tofacitinib(ファイザー製薬)という薬はリューマチ性関節炎に効く薬だそうです。これを経口投与(カプセルとか)や点滴で投与してもハゲには効果はないのですが、皮膚に塗るとネズミの実験では10日間で毛が生えてくるのだそうです。

とはいっても人間の皮膚・毛穴はネズミとはだいぶ違いがあるようで、色々な薬が開発されてネズミの動物実験で効果が確認されても人間では効果がないという結果が今までにも山程ありました。

なので、今回もそんなところだろうと思ったらすでに人間の皮膚の培養細胞で効果を確認しているらしいです。これはほんとに画期的で、いよいよまったく新しい育毛剤が登場するかもという期待が高まります。

ノバルティスの株価の反応を見てみるとマーケットは冷ややかですが、インサイトファイザーの方は上がってますね。

昔も「朗報。髪の毛は培養して増やして植え戻す時代が近い?」という記事にちょっと書きましたが、今までの育毛は「毛包から毛が抜けにくくする」か、「すでにある毛の成長を促す」かという消極的な方法しかありませんでした。

例えば、資生堂 アデノバイタルスカルプエッセンスV(下) はアデノシンを補給して、毛の成長を助ける栄養を与えているわけです。

でも、もっと直観的に毛を生やすというのは難しいのです。今回の発見で、眠っている毛穴を起こしてしまうというのは、自然な方法で副作用が少なさそうなうえに、非常に直接的な手段なので、非常に高い効果が期待できます。

今回論文が掲載されたScience Advancesという雑誌ですが、聞いたことがなかったのですが、あのネイチャー誌と並ぶ二大ジャーナルであるサイエンス誌を出版しているところの姉妹誌のようです。まだVol. 1 No. 9ということですのでかなり新しいです。コロンビア大の研究ですし、雑誌もまともなところなので、ちゃんとした研究ですね。

2015年7月28日 (火)

第6の味覚って本当? 米パデュー大の脂肪の味に反論してみる。

800pxflickr__cyclonebill__bacon_11 Photo by cyclonebill

ねとらぼで記事になっている「第6の味覚は「脂味」 米パデュー大の研究チームが発見」という記事について、コメントしてみます。

ねとらぼの記事によくまとまっていますが、この論文では今のところの定説である甘味、酸味、塩味、苦味、うま味の5つの基本味に加えて新たにOleogustusという脂肪の味?というのを提唱しています。これ自体はいろいろな研究者が主張しているのでいつの日か脂肪の味は基本味として認められるかもしれませんが、まだ誰もちゃんとした証拠をつかんでいないわけです。

かなりボールドな、大胆な主張ですので、これが本当であればもっとインパクトの高いNature誌とか、Science誌に掲載されてもしかるべきな研究成果なのですが、この論文が受理されたのは味覚や嗅覚の専門誌のChemical Sensesですので、読者はガチガチのその分野の専門家だけになります。まあNatureとかは投稿してもダメだったんでしょうね。

Chemical Sensesはこの分野の専門誌なので、レビューもまともな人がやるので悪い雑誌じゃないです。ヘタするとNatureよりもまともな査読になります。なので、一応行った実験の手順やデータはオーケーなんでしょうけど、Chemical Sensesにしては珍しく、この論文は結論がちょっと飛躍している印象があります。

まだPDFがダウンロードできなくって、Abstractプレスリリースしか読んでないのですが、この論文では心理学的な手法でボランティアの学生さんとか少額の謝礼を払って参加してもらった外部の人に被験者になってもらって、いろいろな味の液体を味わってもらってグループ分けしてもらうという手法がメインであるため、彼らの大胆な主張を十分に裏付けるには、かなり弱いです。もちろん液体の色とかにおいとかで差がでないようにいろいろと工夫をして、味だけで違いがわかるかを測るように注意して行われているので、人がnonesterified fatty acidsを他の味と区別できるということについてはまあ間違いないと思うんです。

ただ、それで世間が納得するかというとそうは行かないとおもいます。例えばリンゴも色々と味に違いがありますが、基本味の比率の違いや、食感の違いなどなどの組み合わせで味覚の認識が違うのは当たり前なので、「区別できる=基本味である」とはならないとおもいます。

Abstractやプレスリリースで触れていますが、被験者は”脂肪の味”になれていないので、はじめは”苦味”として認識してしまうといっています。そこで、旨味と苦味と”脂肪の味”の3つを区別するように頼んでみたらちゃんとできたよって内容です。

カプサイシン

砂糖と10倍濃度の砂糖を区別してもらって、区別できたらば基本味を増やさないと行けないのでしょうか?と考えると論理の飛躍というか無茶加減が分かって頂けると思います。(カプサイシンは痛覚でした)

本当にこの結論を受け入れてもらおうと思ったら、nonesterified fatty acidsに対応する味覚受容体細胞とか受容体タンパク質を同定するとか、色々すべきことがあります。

追記。スラドの書き込みで、京大農学部の伏木先生らのグループがCD36というfatty acidsに特異的な”受容体”をすでに同定しているらしいです。少なくとも2007の話らしいので、後出しでOleogustusとか命名までしちゃって図々しいなぁと思いますが、これが定着したらやったもの勝ちなのも事実。うまくやったなぁ。

CD36は脂肪酸以外にもいろいろコラーゲンとか受容する見たいだし、舌だけじゃなく鼻にもあったりするので基本味として認められるまでの道のりはまだ掛かりそう。

以前、第六の味覚:「カルシウムっぽい」発見かというのも話題になったりで、基本味が5つというのは揺れているのは間違いないです。

いま苦味として知られているものはものすごく沢山の化学物質が含まれるので、これを全部一緒にして、ひとつの”苦味”でいいのかというのは議論のあるところですし、旨味のグルタミン酸もはじめは苦味の一種だろうと考えられていたわけなので、基本味が5つのままでいつまで行くかについては個人的にはかなり疑問に思っています。彼らも脂肪の味が基本味であるという主張をしているようです。

ただし、そうするとどこで線を引いたらいいのか?となってきて、難しい話になります。なので、時間はかかるのかなと思います。

2015年5月25日 (月)

ガラス化法により低温保存してから生き返らせた線虫は過去の記憶をもっている。

Persistence of Long-Term Memory in Vitrified and Revived C. elegansという論文の紹介です。PDFもあります。

Vitrification、ガラス化法とは?

Vitrified and Revived C. elegansとはなんのことかと思って調べてみたら平たく言うと線虫を”冷凍”保存してから蘇生したということらしいです。

Vitrifiedという単語は聞き慣れないですが、What is Vitrification?を読むと分かりやすいですが、分かりやすく言えば卵子なのど細胞や小さな単細胞生物などの”冷凍”保存法のようですが、急速に冷やすことで氷が出来ない状態で固化するので、”冷凍”という言葉は不適切らしく、ガラス化法とか訳される場合もあるようですが、多分まだ訳語は定まってないでしょう。

ガラス化法を使うと線虫のような小さな生き物をグリセロールが入った溶液に漬けて、専用の機械で急速に冷やして低音保存することで長期保存可能になりますし、必要になったら専用の機械で急速に温めてやると高い確率(ほぼ100%)で生き返るようです。

うーむ、こんなことできるのかという感じです。

論文の内容

で、ようやくこの論文の内容ですが、線虫の幼虫にものを覚えさせて、Vitrificationを行い固化させてから-80度で2週間低音保存し、溶かしてからまだ覚えているか試したところ記憶が確認できたという話です。

このVitrificationという方法では急速に冷やすことと、氷の形成を防ぐグリセロールの効果で氷が膨らんで細胞を破裂することを防ぐため、細胞に対するダメージが少なく、細胞内や細胞間のタンパク質とかもよく保存されているということで、記憶まで保存できていたという話ですね。

人間でも可能なのか?

まあ上記の論文の方法ではグリセロールをうまく浸透させないといけないので、相当小さな生き物でしか高確率で生き返らせるのは無理ですが、より大きな生き物でも生き返る確率は低いですが出来なくはないと思われます。

実は氷の張った湖に落ちてしまい一時間以上心肺停止状態になってから発見されたようなケースでも、蘇生して、元気になり、脳にもなんら異常がなかったという報告は結構世界中にあります。当然、記憶も残っているわけですから上記の論文の売りの部分の「記憶が残っていた!」という部分はよく考えるとあまり新しくないぞと突っ込みたいところです。

しかも、水の温度が低いほど蘇生する可能性が高いのだそうです。つまり、ゆっくり冷やされて氷ができるよりガラス化法に近い形で速く冷やしたほうがダメージが少ないということでしょう。同じ理由で、発見されてから蘇生の手順もVitrificationのようにできるだけ急いで温めた方がおそらく生き返りやすいでしょう。

ただし、人間のように大きい生き物の場合、グリセロールの浸透も難しそうなので高確率で蘇生するのは難しいでしょう。

私の場合、グリセロールは食品中にもよく入っている化学物質なので、美味しいお刺身を世界中に輸送できるなぁと考えてしまいました。ルイベと違って寄生虫の除去は出来ないと思うけど味が落ちない低音保存法としてコストを考えなければ使えそう。

2014年9月14日 (日)

ホジキン・ハクスレーモデルが否定される?

Medical News TodayのRSSフィードに流れてきた記事「Study confirms that nerve signals are sound pulses」というのが、なんだか衝撃的な内容だった(ホントなら)。元論文が、Physical Review Xとかいう2011年にできたオープンアクセスかつ、物流系の雑誌なのでちょっと眉唾な感じがあるので判断が難しい。

デンマークのコペンハーゲン大学のThomas Heimburgという人のグループが2005年のPNASの論文で提唱した「活動電位の伝達はソリトン」であるという仮説があるのだそうで、それによると活動電位は音波が伝達されるように細胞膜が硬くなったり柔らかくなったりすることで伝達するのだそうです。

耳を疑うような大胆な仮説ですね。どの教科書にものっている基本中の基本であるHodgkin and Huxleyの説を真っ向から否定しています。

根拠となっていたのは、1958年の論文で活動電位が伝達する過程での熱の発生を測定した結果なんだそうで、Hodgkin and Huxleyの説が正しい場合活動電位にともなって熱が発生するはずが、測定結果では伝達にともなって発生した熱がが、すぐさま吸収され、正味ではゼロになるかららしいです。

これを説明するには、活動電位はpropagating electromechanical pulse(電気機械的パルス?)であると考えるとよく説明できるらしく、彼らの2005年のPNASの論文では、細胞膜の脂質は、体温に近い温度でchain melting transitions (位相転換?)を起こす性質があり、その結果、細胞膜が収縮し、細胞膜上にソリトンの伝達が起こる可能性があるという感じで、これに熱の発生・吸収が伴うらしいです。

今回の論文

で、今回の論文はじゃあ、活動電位がソリトンだったら行き違った活動電位は消えずにすれ違うよね?ホジキンハクスレーだとリフラクトリーピリオドがあるので活動電位が通った後の細胞膜は不活性になっているので、活動電位がすれ違おうとするとお互いに相殺するはずだよね?と予想し、実際に測定してみたという内容。

Soliton_model_of_ac

こちらの図がソリトンモデルが予想する伝達の様子。

実験の結果、予想通りにみごとにすれ違いが起こって、何事も無かったように活動電位がそのまま伝達されていくのでソリトンの勝ちという話。

ディスカッション

ふーむ、まずRefractory periodってせいぜい1-2 msじゃないのだろうか。逆方向からのスパイクを消せるくらいの効果が本当に期待できるのだろうか。

そもそも相殺しないとホジキンハクスレーがほんとに否定されるのだろうか。

これロブスターの体節を走るぶっとい軸索神経でやったみたいだけど、ミエリンがあるような普通の神経でも同様なことが起こるのだろうか。

アクソンヒロックあたりの活動電位の開始部でも同じことが起こるならまだ信憑性が出てくるけど、軸索だと普通はそっから活動電位は発生しないので、Refractory Periodの話とあまり結びつかないんだけどな。

chain melting transitionsの話も、大体100m/sで伝達するような活動電位を考えた時には細胞膜が1nmくらい収縮すると予想され、上記の位相転換が起こったときの収縮予想とよくあっているらしいけど、それだとこれはミエリンがある軸索での伝達速度は説明できるけど、無脊椎動物とかのミエリンなしの場合の遅い伝達速度を説明するのに困っちゃうと思うんだけど。

ソリトンだとそもそもミエリンで絶縁する意味が非常に薄まる気がするんだけど、ならなぜ一生懸命絶縁するのだろう。

つーか、水生動物のほとんどは変温動物で、体温は水温より1度くらい高いくらいだ。人間でも風邪引くと体温結構変わる。温度によって活動電位の速度が大きく変わったり、伝達しなくなったり、いろいろと問題ありそう。

この元論文もPNASに乗ったとはいえ、PNASはまともな論文といい加減な論文が混在するので油断できない。残念ながらやっぱりとんでも系の論文に見える。

物理畑の人が生物学の問題について書く典型的な論文だなこれ。壮大な風呂敷を広げて、真ん中に大穴が開いている系。

数式とか、沢山あって、レフリーが生物学者だと「おお、なんかわからんけど数式が凄いからOK。」と思い、物理系のレフリーだと「生物学な問題はわからんけど数式はあっているからOK。」とかいって論文を通してしまうんだろう。

NEURONとかでちょこちょこっとモデルして、ホジキンハクスレーのままでいいじゃんというストーリーで反証するような論文かいてみたら面白そうかなと思った。でもそれをPhysical Review Xに投稿するとたぶん論文はあっさり通ってしまって、1500ドルを著者が払うことになって出版社の思う壺だな。この約15万円も元をたどれば税金ですよ。eLifeという出版費用がタダなオープンアクセスジャーナルもある見たいなので、こっちで反論すべしだな。

まあ、気になった方は元論文を読んでみると面白いと思います。オープンアクセスなので自由に読めます。

おまけ

2007.6.14のWired.jpの記事新説:神経の情報伝達は、電気ではなく「波」というのを見つけました。

面白いのは著者のこの発言:

とはいえ、JacksonとHeimburgの両氏は、新説が間違っている可能性が高いことも認めている。ただし、検証の価値はあると考えている。 「われわれは間違っているかもしれないが、正気を失ったわけではない」とJackson氏は語った。

2007年から温めたアイデアを2014年に実験で実証しようとした執念はすごい。しかし、ほんとにこれで証明できているのかもっとよく考えてほしい。

2014年8月14日 (木)

TiddlyWiki for Scholarsがやたらっカッコいい件。

Tw_for_scholar

tiddlywikiのGoogle groupsのスレッドにあったTiddlyWiki for Scholarsというのがすごいです。Tiddlerの下にくっつけられるウィジットがなんか強力そうだし、とてもスタイリッシュでかっこいい!!

アルファプレビューということで、empty版の配布はまだされていないですが、もうすぐリリースになると思われます。

2014/08/14の段階ではTiddlyWikiのバージョンは5.0.13-betaですが、TiddlyWiki 5.0.14-betaがリリースされると自動アップデート機能が追加される予定なので、製作者のAlberto Molinaさんは、その機能を使ってempty版をつくる予定だそうですので、使いはじめるのはちょっとまった方がいいですね。

おや、TiddlyWiki 5.0.14-betaが執筆中にリリースになりました!ただバグが早くも見つかったので、5.0.15-betaが24時間以内にリリースされる予定ですが。。いづれにしろ、数日中にTiddlyWiki for Scholarsのempty版の配布があると思われます。

Tiddlerの下にくっつけられるウィジットでは、コメントつけたり、関連した情報をいろいろと貼っつけることができるようで、なんか凄そうなんですが、ちゃんと試していないのでどうやって使いこなすのかわかりません。

empty版の配布がもうすぐなので、それから試してみますね。楽しみ。

追記) 2014/08/17日曜日にTiddlyWiki for Scholarsベータ版がリリースになりました。TiddlyWiki 5.0.14-betaを元にしているようです。同じ日にTiddlyWiki 5.0.15-betaへのアップデートもメーリングリストでは予告されてますが、それは待たないでリリースになったようですね。

下の方のHow toのところにある緑色のDownloadボタンからダウンロードできます。あとは自分のTiddlersをインポートすればいいですね。

使いこなすまで時間が掛かりそうですが、面白そうです!

2014年8月 2日 (土)

今から始めるPython その5 文字列、リスト、numpyスライシング

さて、前回までにPythonの研究向けディストリビューションであるPython(x,y)をインストールし、付属するIDEであるSpyderをつかってpylabの仕組みを説明、ネームスペースについて触れました。

本ブログでは普通のチュートリアルではカヴァーされていないような初心者がつまづきそうなトピックにフォーカスしながらやっていきたいとおもっているので、今のところかなり変なPython入門シリーズになっています(とくにその3,4)。

さて、いよいよnumpyを使い始めていきます。numpyは高速な配列を提供するライブラリですが、これがなかったら私はPythonは使っていなかったとおもいます。それほど重要なライブラリです。

今回は、numpyを使うにあたって重要なスライシングについて見ていきます。

Pythonで文字列、リストのスライシング

シリーズのタイトルが「今から始めるPython」なので、一応Pythonの基本を見て、numpyアレイを扱うまでの基礎を見て行きましょう。

巷にPythonチュートリアルはたくさんありますが、Python公式のPython チュートリアルはとてもオススメです。私がPythonの基本を覚えたのも公式サイトのチュートリアルでした。

ただで読めるPython公式サイトの日本語チュートリアルがコスパと質のバランスでやっぱりいちばんいい気がしますので、これを一緒に見て行きましょう。

それではまず、3.1. Python を電卓として使うでPythonのインタプリタを計算機代わりにつかって、簡単な計算をしてみましょう。

まあ、3+5としたければ3+5と打てばいいという、とても当たりまえな内容で問題ないとおもいますが、剰余の計算が、MATLABだとmod(X,Y)みたいにして関数が必要なので、思わずPythonではどうやるんだっけと調べてしまうことがありますが、実はオペレーターがあって%だけでいいのが、ちょっと注意ですね。

5 % 3

とすると2が得られます。

あとは、

5/3

とすると答えがざっくり1になるのが驚いてしまうと思います。これは、もともとPythonではデータ型が保たれるような仕様であったため、Python 2系まではデフォルトでは整数同士の割り算は整数の答えになります。

MATLABから来た人は気持ち悪いし、初心者がびっくりする部分なのでPythonのバージョン3系ではちゃんと小数点のついたフロートのデータ型で答えが出るようになりました。でも、Python(x,y)をおすすめしている当ブログではPython2系をつかっていますので、整数型の答えがデフォルトです。しかし、この仕様は実は変えられるので、

from __future__ import division

と未来からのモジュールをインポートすると、先程の結果が、1.6666666666666667に変わります。私はこれ便利でよく使っています。

あとは、Pythonを起動してすぐでインポートが面倒なときは、

5/3.0

として、フロートの計算なのでフロートの結果になるようにしたりもします。

便利なのは、たまに割り算の結果の整数部だけ欲しいので、floor(5/3)なんてやることがあります。実はこれは、

5 // 3

としても同じことで、スラッシュが二重になると小数点が切り捨てになります。ちょっと便利ですね。

あとはMATLABだと階乗はハット(^)で2^10みたいにやったように記憶していますが、Pythonでは2**10のようにアスタリスクを二重にします。

あとはMATLABのansに相当するのがアンダースコア(_)で、計算機代わりに使うときは割りと便利ですね。

3.1.2. 文字列のところは、文字列のスライスのあたりまでnumpyにはあまり関係ないので説明は飛ばしますが、難しくないのでざっと読むといいと思います。"hellow" * 3とかで"hellowhellowhellow"になるのは結構斬新です。

ここで、スライスの考え方はMATLABから来たらほぼ同じなのですんなり行くと思いますが、多少違いもあるので、気をつけましょう。

word = 'Python'

として、word[0]でPにアクセスできるからわかるようにPythonではインデックスは0から始まります。MATLABは1からだったりするのでややこしいですね。

で、重要なのは

word[-1]

ですね。MATLABだとword[end-1]みたいに書くところが、endがない形でスッキリみえるけども、ひと目で初心者が分かりやすいコードはMATLABの方ですね。私はnumpyに慣れたので、スッキリしていいと思います。

word[2:5]

のように、部分的にスライスしたり、

word[2:]

のように、こっから全部という風にかけたり、

word[2::2]

ステップサイズを2に指定したりと出来ます。MATLABだとインデックスがずれて、[3:2:end]という感じでしょうか(もうMATLAB忘れている)。

このスライスはnumpyでも全く同じなので、覚えましょう。これを多次元に拡張するとnumpyのスライスになります。

3.1.3. Unicode 文字列は飛ばします。今はざっと読んでください。

3.1.4. リスト さあ、いよいよリストです。リストは、MATLABでいうCELLみたいな感じですが、リストのほうがめちゃ便利です。Pythonにはあとはタプルとディクショナリがありますが、リストが一番よく使うもので、リストを覚えたらタプルは簡単です。

リストも文字列のときと同じようにスライスが出来ます。

squares = [1, 4, 9, 16, 25]

squares[-3:]

とすると最後から3つをスライスして、

[9, 16, 25]

という結果になります。

意外と忘れるのが、リストを繋げる操作(コンカテネーション)です。リストは実は+オペレーターであっさりとつなげられます。

なので、

squares + [36, 49, 64, 81, 100]

とすると

[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

という結果になります。

なんでこれが忘れがちになるかというと、リストの後ろに要素を増やそうとするときには、普通appendを使うからです。

ちょっとSpyderなどのコンソール上で、

print dir(list)

としてみるとアンダースコアが付いたものの他に

'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort'

というのが出てきます。ここでのlistはグローバルスコープにあるリストのタイプを規定しているオブジェクトで、dirでもってリストが持っているメソッドを表示させているわけです。

a = []

または

a = list()

として変数aを初期化したリストにして、

a.append(3)

とするとaの中身が[3]になります。

こういう感じに最後に要素を継ぎ足していくときに使うappendはむっちゃ使いますので、発想としてはさっきのsquares + [36, 49, 64, 81, 100]をしようと思うより先に

squares.append([36, 49, 64, 81, 100])

としてしまいたくなるわけですが、これだと結果が違って

[1, 4, 9, 16, 25, [36, 49, 64, 81, 100]]

となってしまいます。 リストはCELLのようにいろんなオブジェクトを要素として持てるので、リストの中にリストというのも可能なんですね。で、appendしたときに渡すものは一要素として追加されるので、上の様に6番目の要素はリストとしてひとまとまりで入ってしまうわけです。

どうしてもappendでやろうとおもったら一つ一つ追加する必要があるので

for element in [36, 49, 64, 81, 100]:
    squares.append(element)

という形になります。これは、フォーループですが、PythonではMATLABのようにendは使いません。その代わりループする内容のまとまりを表すのにインデンテーションを使います。インデンテーションとは、左側のスペースのことです。普通はタブか、スペースを4つつかいます。これが同一ブロックでスペースか一つでもずれるとエラーになるという、非常に厳しいルールです。多少窮屈ですが、このルールのおかげで他人が書いたコードを読むときにスラスラ読めてしまう効果を実感すると、利点の方が大きいことがすぐ理解できると思います。

リストには文字列やタプル、ディクショナリ、関数、クラスオブジェクト、などなどなんでも格納出来ます。

numpy超基本その1

さて、ながなかと準備してきましたが、いよいよnumpyを見ていきます。

MATLABから来た人はぜひ、NumPy for MATLAB usersというチートシートを活用しましょう。

Numpyの基本については、個人的に良くまとまっていると思った、J.R. Johanssonさんという方が作ったiPython notebookが参考になるので、これを一緒に見て行きましょう。

まず、

%pylab inline

としていますが、これはIPythonのマジック(特別機能)である%ランチャー機能をつかっています。我々はインタプリタにはIPythonではなくSpyderを使っている前提なので、かわりに

from pylab import *

の呪文を唱えましょう。基本的に同じことがおこります。

つぎに、

from numpy import *

としていますが、これはpylabと同じネームスペースですね。はっきりいって、上でpylabを呼んでいるので、必要ないのですが、まあ害はありません。

pylabのネームスペースは、トップレベルにnumpyとmatplotlibの関数をもってくるので、気持ち悪い人は気持ち悪いかもしれません。pylabはさらにnumpyをnpのネームスペースにもインポートします。numpyは普通 import numy as npとして使われるのでそのスタイルに慣れている人向けですね。

pylabはインタラクティブな解析でMATLAB代わりにするならタイピングが少ないのでいいと思いますが、長いプログラミングを書くときはPylabじゃなくmatplotlibからpyplotを掘り出して来て使ってネームスペースを分けるのが普通です。

そして、リストを渡してnumpy arrayをつくり、dtypeやsize、shapeを説明しています。このへんは簡単ですね。

注意すべきは

M[0,0] = "hello"

でエラーになっていることですね。これは、numpy arrayはリストとはちがって同じデータタイプのものしか入れられないという重要な制限があるからなんですね。これは、numpy arrayのメモリ上のレイアウトを最適化し、必要最小のメモリー領域をつかい、最小のオーバーヘッドでもってアレイの要素にアクセスするための仕様なのです。numpyの速さの秘密の一つです。

なので、たとえば自分のデータが0から255までの整数しかないとわかっている場合は、numpy arrayのデータタイプとして最適なnumpy.uint8を選んでやると一番パフォーマンスがでます。なんだかC言語をやっているみたいですね。

データタイプはアレイを作るときに

M = array([[1, 2], [3, 4]], dtype=np.uint8)

のように指定できます。我々はpylab環境にいるのでnpを省いて

M = array([[1, 2], [3, 4]], dtype=uint8)

でもオッケーです。ちなみにarray自体もnumpy.arrayのことですが、pylabがトップレベルにインポートしているのでnumpyを省いてもかけますし、np.arrayにもエイリアスがあるので、これでも同じです。

さらには、

M = array([[1, 2], [3, 4]], dtype='uint8')

のようにクォーテーションでくくってもよく、これはpylabでなくってもオッケーです。私はいつもnp.uint8ですが、この辺りは好みです。

さて、このMを浮動小数点型にしたいとおもったら

M = M.astype(np.float)
M = M.astype(float)
M = M.astype(np.float32)

などとして、データタイプのキャストができます。

そして、arangeやlinspaceですね。linspaceはMATLABでおなじみですね。x = arange(0, 10, 1) でarangeに渡している2番めのパラメータ10は最初のいらない要素を意味するので、0から9までを1刻みでとったアレイになるんですが、これはnumpyアレイのスライスと同じと覚えるといいと思います。あと、3つめのパラメータは省くと1になるのでこの場合省けます。

さっきの

squares = [1, 4, 9, 16, 25]

をつかってnumpyアレイaを作ってみましょう。

a = array(squares)

ここで、a[:2]とすると2は最初のいらない要素のインデックスなので、欲しいのは0,1になって、結果は

array([1, 4])

となるのですね。arangeはnumpyならではの関数なのでpython/numpyのインデックスを踏襲しているわけです。でも、linspaceはおそらくMATLABとの互換性を高めるためにつくられたかなり機能のかぶっている関数なので、動作がMATLABの様になっているわけです。

その後はざっとながして、次に便利なのは

M.nbytes

ですね。これで配列のメモリ上の大きさがバイトで分かります。MATLABではwhosというコマンドがあってよく使っていたと思いますが、numpyにはwhosみたいなのはないです。勘違いnp.who()というそっくりなコマンドがありました。pylab環境ならwho()です。whosだとそんなのないと怒られるので、随分の間ないものと思っていた。。。

numpyアレイに関してはwho()が一番いいですが、listやdictは表示されませんので、Pythonにもglobalsという関数をつかってグローバルなスコープにある関数・変数をディクショナリとして返してくれますが、ちょっと情報量多すぎで、必要な情報を探すにはフィルターしないと大変です。例えばディクショナリだけ表示とか

[ k for k,v in globals().items() if type(v) == dict ]

またはリストだけ表示なら

[ k for k,v in globals().items() if type(v) == list ]

とできます。

もしくは'A'で終わる変数名だけなら

[ k for k,g in globals().items() if k.endswith('A') ]

とかです。

Spyderにはオブジェクトヴュアーがあってwhosの代わりになります。また、IPythonにはwhosがあったりします。IPythonは便利なのは便利ですが、Python初心者には混乱するかもしれないので、まだ説明してませんが、慣れた頃にぜひ試してみるべきツールです。

さあ、とうとうインデックシングのところまできました。リストと文字列のスライスの説明をしてきたので、かなり分かりやすいとおもいます。Fancy indexingがMATLABから来た人なら当然のことですが、そうでないと咀嚼するのに時間がかかりますね。

66行目に

[n for n in range(5)]

とありますが、これはリストコンプリヘンションというもので、とっても便利です。これは、ちゃんとした説明の記事が必要なくらい重要なテクニックなので、ここでは簡単にフォーループに読み替えたときに出てくる要素がリストの中身になるような感じと思ってもらえばOKです。ここではrangeというPythonのビルトイン関数をつかって0から4までの要素のリストを作っています。

ただし、

array(range(5))

とやってもarray([n for n in range(5)])と同じ結果が得られるので、リストコンプリヘンションを使う意味があまりありません。(突っ込んでばかりですみません。。)

同じことをするなら、おすすめはNumpyのarangeを使って

B = arange(5)

で、結果は同じです。(pylabはトップレベルとnpにnumpyをインポートしているのでnp.arangeでもarangeだけでも同じ結果。)

リストコンプリヘンションの便利な使い方を一例だけ紹介しておくと、

[n for n in range(100) if n % 11 == 5]

なんてやると100までの整数で11で割った時のあまりが5になるような数を選んでリストを作れます。

次の、

row_mask = array([True, False, True, False, False])
B[row_mask]

のマスクの使い方はとても便利です。ぜひマスターしましょう。

応用としては、

B>3

とすると

array([False, False, False, False, True], dtype=bool)

という結果が得られるとおもいますが、これをつかって

B[B>3]

という風にするとアレイBの中から3より大きい要素を抜き出すことが簡単に出来ます。

array([4])

takeとかchooseって使ったことがない。Fancy indexingで十分な気がします。

さて、Linear algebraのところでたどり着きました。 これで大体半分消化しましたが、長くなったので、続きは次回 その6 numpyの基本 スライシングの続き にしましょう。

2014年7月26日 (土)

今から始めるPython その4 pylabネームスペースの解説

前回の「今から始めるPython その3 Site-Packagesってなに。モデュールのインストール・アンインストール」ではちょっと脱線して、モジュールのインストール・アンインストール関係に重要なSite-PackagesについてPython(x,y)を使う前提での注意点などを、解説しました。

今回は、流れを戻して「今から始めるPython その2 Spyderを使う」で使ったpylabの説明の続きをやります。

pylabの使い方は、このNicolas P. RougierさんのMatplotlib tutorialというチュートリアルが素晴らしいので、コードサンプルについては丸投げし、あまり初心者むけの解説がないと思われるpylabの魑魅魍魎としたネームスペースについて解説します。

MATLABとのネームスペースの違い

MATLABでは、関数を定義するときは、関数名と同じ名前のファイルを作って、そのファイルがある場所をパスに追加するか、そのフォルダへ移動しないと定義された関数が使えません。パスに追加してあれば、いつでも使えます。一つのファイルに、ファイル名と同じメインの関数の他にメインの関数が使うサブの関数を定義することはできますが、これはローカルなスコープの関数なので、サブの関数はユーザーには見えません。同じファイル中にあるメインの関数だけがサブの関数を使うことができます。

一方、PythonではMATLABと違い一つのファイルに色々な関数をまとめることが出来ます。

例えば、MyModule.pyというファイルをつくり、そこにfunctionAやfunctionBといった関数を定義したとしましょう。これをコンソール上や他のスクリプトから使うには、import文を使い

import MyModule

のようにMyModuleをインポートし、モジュール名と関数名をドットでつなげたMyModule.functionAのような感じでアクセスするのが普通です。モジュール名さえユニークな名前をつければ、その下にある関数はありがちな名前でもモジュール名との組み合わせはユニークなのでMATLABのようにユーザーが定義した関数がMATLABのオリジナルな関数を上書きしてしまったなんてことを簡単に解決できます。

関数を定義したファイルの置き場ですが、コンソール上では定義されたファイルと同じフォルダにos.chdirで移動すれば、インポートできます。また、スクリプトをファイルに書くときは、スクリプトファイルを関数が定義されたファイルと同じフォルダに置きます。

これだと複数の場所にあるスクリプトからインポートするのが大変なので、そういう場合はsite-packagesに置いておけば、どのフォルダにいるか関係なくインポートできます。

これは、効果としてはMATLABでパスを追加した様な感じです。ちなみに、インポートできるパスの範囲を一時的に変更するには

import sys

として、sysというスタンダードライブラリをインポートし、sys.path.appendでインポートしたい関数が書いてあるファイルへのパスをシステムに追加してやることで、importが追加されたパスからもできるようになります。

ネームスペースのおさらい

pylabはプロットするのに便利ですが、色々とてんこ盛りなので、全容を把握するのはかなりややこしいです。その2でネームスペースの解説をしましたが、結構なれるまでは難しいかもしれません。でも、たくさんのライブラリがあるPythonのような言語ではネームスペースはライブラリ名の衝突を避けるためのとても柔軟でスマートな解決法なので、もうちょっと詳しく見て行きましょう。

ウインドウズで、よく使うソフトウェアはショートカットをつくってデスクトップに置いたりしますね。Pythonのimport文はちょっとこれに似ています。

例えばpylabをインポートすると自動でインポートされるnumpyを例にあげて解説します。公式に推奨されているnumpyのインポートの仕方は

import numpy as np

です。インポート文はその3で解説したSite-Packagesにあるサードパーティ製のライブラリや、Pythonの標準ライブラリにあるモジュールやパッケージを使えるようにする文ですが、このようにas なになにとすることでショートカットのように好きなエイリアス(アダ名)をつけて呼べるようになります。

人によっては

import numpy as N

なんてする人もいますし、

import numpy

でそのままつかってもかまいません。

numpyアレイをつくろうと思った場合、それぞれ

data = np.array([1,2,3])
data = N.array([1,2,3])
data = numpy.array([1,2,3])

のようにして、numpyの関数・クラスにアクセスするわけです。

さて、pylabの標準的な使い方である、

from pylab import *

では、from文を使って、pylabの下にある関数・クラスをワンレベル掘り出していると「その2」の方でも解説しました。pylabはnumpyに依存するので、pylabを上の方法でインポートすると、自動的にnumpyもインポートされますが、これが実はトップレベルとnpネームスペースの両方で使えるような形でインポートされています。

pylabのソースコード(普通は、"C:\Python27\Lib\site-packages\matplotlib\pylab.py"にある)を見てもらうと

from numpy import *
from numpy.fft import *
from numpy.random import *
from numpy.linalg import *

from matplotlib.pyplot import *

# provide the recommended module abbrevs in the pylab namespace
import matplotlib.pyplot as plt
import numpy as np
import numpy.ma as ma

というセクションがありますが、はじめの4行で、numpyのいろいろな関数を掘り起こして、トップレベルでnumpyと書かなくとも使えるようにしています。このおかげでMATLABのような感じで使えるようになるのです。

例えばMATLABでゼロ行列をつくろうとおもったらzeros(2,2)のようにしますね。numpy.zerosという関数がこれに相当しますが、from numpy import *でトップレベルにzerosを持ってくることで、zeros((2,2))のようにして、MATLABでzeros(2,2)としたときに相当することができます。

ただし、多くの場合numpyの関数はnp.zerosのように使うのが普通なので、np.zerosでも同じ関数が使えるようにするために下の方で、import numpy as npも行われているのです。

このようにpylab環境下では、numpyはトップレベルとnpネームスペースの両方から使えるわけです。

例えばnumpy.fft.fftという関数は、fftだけても使えますし、np.fft.fftとしても使えます。先程のarrayもトップレベルにあるのでdata = array([1,2,3])でもdata = np.array([1,2,3])でもいいのです。便利ですが、ちょっと混乱しますね。

普通は二重にインポートするようなことは混乱の元なので、まずしないんですが、pylabの存在意義はMATLABから来た人が移行しやすい環境、タイピングのすくないインタラクティブにデータを解析するための環境を用意することなので、これはかなり特殊な例です。ちなみに二重にインポートしても、ショートカットをもう一個つくった感じなので、メモリーを二倍使ったわけではありません。

同様にpylab環境以外でmatplotlibをつかってプロットをするときはimport matplotlib.pyplot as pltとしてpyplotをpltというエイリアスで使うのが推奨されています。pylabではpyplotにある関数をfrom matplotlib.pyplot import *でトップレベルにもってきつつ、通常の使い方であるpltでも使えるようにimport matplotlib.pyplot as pltも行われています。

他にもいろいろなことがグチャグチャと行われているのがpylabですので、使う分には簡単で、便利ですが、全容を把握するが難しい所以がここにあります。わけが解んなくなったらば、一度ソースコードの最初の部分を眺めておくと中身でどんなライブラリがインポートされているのかがわかります。ドキュメンテーションを読むよりもこっちのほうが私にはわかりやすかったです。

長くなってきたので今回はこの辺で終わっておいて、次はいよいよ文字列、リスト、numpyのスライシングをマスターしてみましょう。

より以前の記事一覧

広告欄


やっつけタイムライン

広告欄

はてブ

人目の訪問です。

  • follow us in feedly

    かなり更新が不定期なため、RSSリーダーをオススメします。現在Feedlyに122人登録頂いています。多謝!RSSを表示

    ブログランキング用 にほんブログ村 IT技術ブログ Pythonへ ブログランキングならblogram






    Jenny Mayhem
2017年7月
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          

IT技術注目記事

無料ブログはココログ