pythonで距離行列を計算する
求めるものがすぐには出てこなかったのでメモしておく。
距離行列が欲しい際にはscipy.spatial.distanceを使う
例えば、
from scipy.spatial import distance n = 10 data = [[random() for i in range(n)] for i in range(n)] dist_vec=distance.pdist(data)
これは距離行列の上三角部分だけを返してくれる。
距離行列はそもそも対角成分が0の対称行列なので、
上三角部分だけベクトルで返してくれれば情報として十分である。
これを距離行列に変換したければ、
dist_mat=distance.squareform(dist_vec)
でできる。
なお、逆変換もこれでできるらしい。
距離行列を直接求めるのであれば、
distance.cdist(data, data)
でもいい。
pycharmとanacondaの連携(初心者向け)
前回書いた通り、pythonの環境構築にはpycharmとanacondaの組み合わせを勧める。
code-for-beginner-my-memo.hatenablog.com
今回は、両者をどうやって連携させるの?ということについてメモしておく。
両方インストールした後には、ひとまず
docs.continuum.io
のpycharmの項目に書いてあるようにすればひとまずコーディングはできるようになる(はず)。
windowsだと多少画像とは異なるが、
File->Settings->Project:myStudy->Project Interpreter
で同じようにできる。
なおここではプロジェクト名をmyStudyとした。
仮想環境を構築した場合も同様である。
pycharmの下部にはterminalタブがある。terminalタブで
conda create -n py35 python=3.5
と入力してみよう。
そしてProject Interpreterの右上の歯車からAdd localを選択し、
C:\Users\YourName\anaconda3\envs\py35\python.exe
を選択すればmyStudyプロジェクトにおいては、python3系の環境でコーディングができる。
もし追加でライブラリをmyStudyプロジェクトにインストールしたければ下部のterminalから
conda activate py35 conda install numpy=1.10.4
を入力すればよい。もちろん
conda install -n py35 numpy=1.10.4
でも同じことができる。
同様にすれば別のプロジェクトで別の環境を構築することができるわけだ。
なお、Project Interpreterの右上の歯車にはcreate conda envの項目があるのでそっちでもできる。
これでpycharmとanacondaの仮想環境を連携させることができたので、あとは好き放題コーディングできるはずである。
今回はここまで。
記事にもし万が一15円以上の価値を見出したら寄付を頂けると幸いです。
今月末macの新作が出るらしい…ですよ?(買う金はない。あてもない。つもりもない)
code-for-beginner-my-memo.hatenablog.com
pythonの環境構築(初心者向け)
単純にpythonを取り扱うのであればコマンドプロンプトでも一応はできる。しかし本格的に長いコードを書こうと思った際には統合開発環境(コンパイラ、デバッガ、エディタが一つにまとまったもの)が必要になる。
そんな際にはPycharmを勧める。
www.jetbrains.com
コード補完機能が大変便利である。
普通にダウンロードできるので特に困ることはないと思うが、もし不安なら
PyCharm のインストール – Python でデータサイエンス
でも見てみるといいんじゃないだろうか。
統合開発環境は初心者でも何をやっているかわかりやすいと思う。(こう書くと怒られるかもしれないけど)コーディングする際に使うメモ帳の代わりくらいの認識でよい。
問題はここから書く内容である。
pythonは2系と3系があり、たまに2系でしか動かないライブラリが存在する。
そうした際に備えて両方の環境を行き来できたほうが良い。
(なおこれからpythonを覚える人は3系を勧める。pythonは若い言語なので過去の遺物に縛られる必要はない)
それとライブラリをどうやって入れたらいいのか?そして入れたライブラリをどうやって管理するのが良いのだろうか?となっている人もいるだろう。
また、開発環境を区切ったほうが何かと便利である。例えば2系の環境を一つ、3系の環境を一つ、webアプリ開発環境を一つ、といった具合にである。
以上三つの要求であるバージョン管理、パッケージ管理、仮想環境管理を可能にするものとしてanaconda(もしくはminiconda)を勧める。
詳しくは以下のリンクを見ていただきたい。
(ちなみに僕はpipもpyenvもvirtualenvも使ったことがない。condaで十分では?)
使い方はいたってシンプルである。windowsならコマンドプロンプトで操作する。
1.仮想環境を作る
conda create -n my_env_name python=3.5
2.仮想環境をactivate
conda activate my_env_name
3.仮想環境に必要なパッケージを入れる
conda install numpy=1.10.4
このときパッケージのバージョンを選択できるので、バージョン管理としての機能を合わせて持つわけである。
これで、仮想環境下で必要なバージョンのパッケージを入れることができた。
詳しいcondaの使い方は上のリンクが日本語で書かれていて大変わかりやすい。
もし手元に何か資料を置いておきたいと思ったら
Conda user cheat sheet
http://conda.pydata.org/docs/_downloads/conda-cheatsheet.pdf
これを勧める。よく使う機能についてまとめてあり便利である。
さて、これでpythonで本格的コーディングをする準備が整った。
pycharm + anacondaで快適に、そして自由にコーディングできるはずである。
しかし、多くの記事はpycharmとanacondaをどうやって協調させるの?については触れていない。
そこで、次回はそれについて書こうと思う。誰かの助けになればいいと思っている。
今回は他のwebページの紹介に終始しているのであまり自分では新しい情報を提供しているわけではないが、
奇特な方がいたら募金してほしい。
code-for-beginner-my-memo.hatenablog.com
プログラミング初心者に僕がpythonを勧める理由
今回のタイトルのような記事は他にも無数にあります。
特に初心者にお勧めの言語をランキング付けしているケースが多いです。
僕はあまり多数の言語に触れたことがないのでそういう比較はできないのですが、
それでもpythonを触ってみて、この言語こそ初心者が真っ先に勉強すべきだと感じました。
その理由を書きたいと思います。
結論から言えば、書くコード量が少なく、プログラミングを勉強するモチベーションを維持できるからです。
pythonではライブラリ(汎用性の高いコードのまとまり)が大量にあります。
何かを作りたいと思った際には、他人のサンプルコードを参考にしつつ、どういったコードの流れが適切かを考え、なるべくライブラリを使ってコーディングすべきです。
ライブラリを活用することで、自らが書くコード量を削減しつつ、目標のものを作れるはずです。
もちろんその最中にわからないことを調べることがpythonの勉強に相当します。
プログラミングを勉強し続けるためには「何かを作れた」という満足感が重要であるので、初めのうちは簡単なものから順に、言語の細かい仕様を理解しなくてもとりあえず作ってみる、という姿勢が重要に思います。
そのため、覚えることが少なく、かつ変数の宣言などを必要とせず、ライブラリの力を借りることができるpythonをお勧めします。
pythonを勉強するにあたっては、辻 真吾先生のPythonスタートブックをお勧めします。(ちなみにリンク先で購入しても僕には一銭も入らないのでご安心ください)
今回の記事の本筋は以上です。
が、上で「コードの流れ」という言葉を使ったので補足しておきます。
コーディングをする際には、コードを書くということも重要ですが、コードをどういった流れで構築するか?が最も重要であると僕は考えています。
僕がかつて躓いたのがこの点です。
目的の機能を達成するためにどういった要素に分割すべきか?を考えられるようになるのが、初心者日曜プログラマーがまず身に着けるべき素養だと思います。
例を挙げます。
観念的な例ですが、カレーを作るというコードを考えてみましょう。
この時に一つの考え方としては時系列で順にコードを書いていくというのがあります。
1.ジャガイモの皮をむく
2.ニンジンの皮をむく
3.ニンジンを切る
4.玉ねぎを切る
5.ジャガイモを切る
6.肉を炒める
7.ニンジン、ジャガイモ、玉ねぎを炒める
8.(続く)
……などです。
コーディングの原則としてDon't repeat yourself(DRY)があり、この原則は同じ機能を持つコードを複数個所で書くのを避けるべきと述べています。
上の例でいうのであれば、1のコードをコピペして、ジャガイモ→ニンジンと書き換えるのがDRYの原則に違反しています。
なぜならば、こういうことをすると1のコードにバグなどがあって変更を余儀なくされたときに、2のコードも併せて変更する必要が生じるからです。複数個所の修正が必要になり、変更が困難になります。
当然ですがもっと良い書き方があります。
まず、「むく」という作業を関数と捉えて、引数として野菜を与えれば、1と2のコードをひとつにまとめられます。2,3,4も同様に「切る」という機能を持ったコードにまとめられるでしょう。
結果としてカレーを作るコードに必要なのは「むく」「切る」「炒める」…などであることを真っ先に構想してから書き始めます。
このようなコードの流れの構想を習得するのがプログラミング初心者が真っ先にすべきことだと僕は考えます。
この記事を1年半前の僕に見せてあげたかった……。
自己紹介(というよりはブログ開始の理由説明)
初めまして。
思い立ってブログを始めてみました。
本ブログにおいてはpython初心者の僕が日ごろ発見したことを書き連ねるブログです。
このブログで知ったことがお役に立てれば幸いです。
が、役に立たなくとも責任とれません(断言)
始めたきっかけは(無粋で申し訳ないのですが)お金の為です。
本ブログではpythonをメインに書こうと思っていますが、プログラマの間ではコードを公開する文化が盛んです。
これはプログラミングという文化を活発にするという意味でも非常に意義があることだと思います。
一方で、簡単なコードならまだしも、複雑なコードになると「会社等では人力で数時間がかかる作業をコピー&ペーストでできる」という事態になります。いわゆるフリーソフトもこれに相当するでしょう。
個人的には数行、数十行で書けるコードでお金を稼ぐのはナンセンスだと思います。
ですが私は裕福ではなく、あるものを買うためにお金が必要ですがそれだけのお金がたまる見込みがない現状です。(なお「あるもの」とはmac book proの中古です。約7万円)
そんな時に、フリーソフトを公開している方がブログ上で寄付を募っているのを見かけました。
そこで思ったわけです。
「簡単なコードでお金を取るのはナンセンス。でも寄付なら決定権はユーザーにあるからいいんじゃない?」
というわけでこのブログが爆誕しました。
役に立たなかったり、役立ったけどお金を払う価値は見いだせなかったりした方は、僕からは時間を無為に費やさせてごめんねとしか言えません。
一方で、もしお金を払ってもいいくらい役に立ったよ、という方はぜひとも寄付していただけると嬉しいです。
なお、現金ではなくamazonギフト券のみ受け付けます。これは、僕が寄付する側だったら、用途が限定されるギフト券のほうがいいな、と思っているからです。
目標金額7万円に届くまでこのブログは続ける予定です。……やっぱり疲れたらやめてしまうかもしれません。
というわけで、このブログを開始した理由説明でした。
ここまで読んでくださって誠に感謝いたします。