automatik

Cross the Rubicon

院試後 : 合格とこれから

散々詐欺しまくったが、なぜか番号があってびっくりした。正直よくわからない。まぁ、終わり良ければすべて良しということで。
京都大学の情報学研究科を受ける経緯については、前のブログなどを読んでいただければと。ここでは外部かつ専攻を変える自分がどういう感じで勉強したのかなどを書いておければと思う。

~4月

もともと年明けくらいから外部院進を積極的に考えていた。ただ、僕自身専攻がデザイン系(ということになるのかな)であり、機械学習などを自分で勉強はしてきたものの、コンピュータアーキテクチャ情報理論など、主に情報学科が習う内容はあまり勉強していなかった。あえて言うなら、競技プログラミングを少しやっていたのでアルゴリズムとデータ構造と機械学習くらい。 統計学機械学習の基礎になるため勉強していた。そのため、この頃はnaistを軸に考えていた気がする。あるきっかけでクックパッドの研究開発部の方と仲良くなり、「naistもいいけど、京都大学もいい環境だから、ぜひ一度訪問してみて」と言われたのを機に、せっかくだから他の大学院も見に行こうと思うようになった。

1月にメルカリのBe Bold Internshipで僕のペアとなるビジネス職の人が京大の情報学科の方で、なんとなく京大も視野に入れている、ということを話すと「最近倍率高くて、内部生でも落ちる人多いから、もし受けるならしっかりと勉強したほうがいいよ」という話を聞いて、ちょっと身が引き締まったのを覚えている。(実際同じことを研究室訪問の時にも言われた。)

ここで入試の科目を説明すると、知能情報学専攻では、14科目(くらいだった気がする : 生命学や脳科学なども含む : コンピュータサイエンスと数学で8題)のうちから4題を選択する。また、分野基礎科目という第一志望の研究室から出題される問題を解き, それらとTOEICの点数を加味して合否が決まる。先述した通り, 僕は情報学科が受ける授業の内容を全く受けていないため、そういう科目から勉強し始めた。

春休みに, アルゴリズム, 情報理論, コンピュータアーキテクチャを勉強し始めた。教科書は以下の教科書を読んでいた。
残り1科目何を勉強するのかはこの頃ずっと悩み続けてた。

アルゴリズム

プログラミングコンテスト攻略のためのアルゴリズムとデータ構造

プログラミングコンテスト攻略のためのアルゴリズムとデータ構造

情報理論

情報理論

情報理論

コンピュータアーキテクチャ

コンピュータアーキテクチャ (電子情報通信レクチャーシリーズ)

コンピュータアーキテクチャ (電子情報通信レクチャーシリーズ)

のちに述べるがコンピュータアーキテクチャはこの本はわかりやすいが薄いため、もう少し勉強する必要があることに気づいた。
この頃は過去問見てもさっぱりで、教科書のわからない部分を各大学の講義資料を見たりしながら理解して勉強することを心がけた。

4, 5月

結局他の大学を受けず、京大一本に絞ることに。京大の情報理論の問題演習には、西田先生の授業資料に問題がついていて、一部解答もついているのでそれを使って演習することにした。これが功を奏して過去問がかなりスラスラ解けるようになった。(なお本番は...)

コンピュータアーキテクチャはもっと深く勉強する必要を感じたので、パタヘネを上下巻読んだ。
結構しんどいけど、これが一番早道な気がする。何より面白いし。

コンピュータの構成と設計 第5版 上・下電子合本版

コンピュータの構成と設計 第5版 上・下電子合本版

コンピュータの構成と設計 第5版 下

コンピュータの構成と設計 第5版 下

結局機械学習を勉強していたのもあり、最後の1科目はパターン認識機械学習にした。
最近ニューラルネットばっかりだったので、全体をもう一度復習できたのは良かった。

はじめてのパターン認識

はじめてのパターン認識

ちなみに3月のtoeicが630, 4月になって705だった。これはまずい(せめて京大の合格のためには750は最低欲しいと思っていた。)ということで、TOEICも勉強し始めた。この頃はやるべきことがおおく、パンク気味だった。

公式 TOEIC Listening & Reading 問題集 3

公式 TOEIC Listening & Reading 問題集 3

単語さえ知ってれば解ける!と思ったので, 単語力をつけた。これがおすすめ。

6, 7月

苦しい時期。暑いけどできるだけ大学の図書館で勉強をしていた。たしか出願とかもこの時期だった気がする。
志望理由書は読まれるのか分からないが、自分の経歴を盛り込みながら、かつその研究室でやっている内容を自分なりに発展させて行く方向で書いた。

専門科目の勉強としては、上の勉強に加えて過去問を解く + 解答を作成するのを繰り返しながら問題演習をしていた。他大の問題も少し解いたんだけど、解答をつくるのがしんどすぎてすぐにやめた。4科目しか勉強してないのでは、もし本番に1問難しいのがきたらやばいな、と思い統計も勉強することにした。以下の本で演習したら過去問は解けるようになった。(なお本番は...)

統計学演習

統計学演習

個人的に「その分布を知ってますか?」or知らなければ解けないみたいな問題(例えば超幾何分布とか)が出題されてたりはするので(実際今年カイ二乗分布の数理的な話がきて僕は解きませんでした), 各分布まとめておくといいかも。カイ二乗分布許さん。

7月は全ての教科書を読み終えたので、もう一回読んだり、過去問を解いたりしていた。
toeicは勉強の甲斐があってか6月の結果が840点まで上がった。この頃には過去問も解けるし、toeicも点がよくて合格が見えてきたぞ、と思っていた気がする。

8月

院試本番

当日はやっぱりたくさん人がいたけど、ここまでやってきたことを信じて頑張ろうとそれだけだった。
テスト開始と同時に問題を見るや否や情報理論と統計がはちゃめちゃ難しいことに気づく。予備で1科目用意して1科目ぶんのアクシデントに耐えられる設計にしたのにこの始末。結局ノー勉の数学を解くことに。主成分分析や特異値分解を求めるプロセスで固有値対角化は覚えていたけれど、ヤコビ行列を覚えてすらいないため、全く解けない。ガウス積分などわかるはずもなく、数学撃沈。コンピュータアーキテクチャは比較的簡単だったものの、アルゴリズムでオーダーの収束についての問題が出る。あとで考えればlimitを取ればいいだけなのにn!はlognより増加の速度が速いから〜と数式を一つも書かずに脳内のノリで乗り切る。パターン認識は3/5しか解けてない。

分野基礎科目は「機械学習を用いた解法を述べよ」という出題であり、3問中1問はオレオレニューラルネットワークモデルを書いて提出(思いつかなかった..)。
100%落ちたな...という体感だった。

次の日と合格発表日

僕の専攻は合格不合格のギリギリの人が面接に呼ばれるという噂があり、次の日にそれが決まるのだが、それには呼ばれなかった。
そのため、余裕で受かっているか不合格かという形となり、僕の点数を考えると...と超落ち込んでいろんな人にごめんなさいと連絡をしてた。
最終的になんとか受かってて良かった。自分の番号を5度見くらいした。学部で京大に落ちたので、それもあってか本当に嬉しい。特に今回は、名前で京大を選ばずに自分の好きなことをさらに伸ばしたい思いで受けたので、本当に嬉しかった。

細かい情報

TOEIC

3月(4月受け取り) : 630
4月 : 705
5月 : 730
6月 : 840
最終的に6月の結果を提出。 最後の最後で上がることもあるので、一応全部受けておくのをおすすめする。
実際僕が合格したのもTOEICのおかげだと思っているので。

点数開示

[WIP] : 一応開示してみるつもりです。開示結果が来たら書きます。

今後

気分。

BUMP OF CHICKEN『HAPPY』


無事第一志望の研究室に所属することができたみたいだ(が、怖いので合否通知が届いたら指導教官に連絡しようと思う。)。
しっかりと大学院で研究をし、自分の興味に迫りつつ、自然言語処理に貢献できたらと思う。もちろん、大学院に入ってからもしんどいことは多いと思うけれど、それでも専攻を変えてまで頑張れた、自分の好奇心と信念を信じてみたい。界隈の方々、今後よろしくお願いします。

そして、昔からのフォロワーの方々や高校の同期、大学の同期の友達など、辛い時に相談に乗ってもらえて、いつもと変わらず話しかけてもらえて、それが僕の一番の心の支えになったと本心から思う。これからもよろしくお願いします。

もし受験生でなんか質問とかあればtwitterで@misogil0116に気軽にリプライください。

院試前 : 近況

院試まであと残り数日となった。
正直新しく勉強することもあまりないし、仮に勉強したとしても問題をスラスラと解けるまでに落とし込めるということもない。
今までやったことの確認を今日含めこの土日でやって試験に臨もうと思う。
院試を受けると決めるまでの経緯と、そこからの感情の変化を書いて整理をしようと思う。

最近Twitter意図的に見ていないので、用がある方は
taichitary@gmail.com にてメールください(応援メッセージ待ってるぜ(?))。

-------

僕は大学の学部生の間はずっと機械学習を勉強していた。元々ロックバンドが好きで、そのレコメンドエンジンを作ったのがきっかけである。
それからインターンに行ったり、アプリを流行りの技術で作ったり、GANを試したり、先生のもとで論文を書いたり、と色々やっていた気がする。おかげで楽しく大学生活を送ることができた。 3年の終わりになって、さて就職か、院に進むか迷った。 実際、今の技術力で新卒としてなら研究職ではない、機械学習エンジニアとしてならそこそこ採用されるだろうなと思っていた。ただ、「僕がやりたいことは、本当に、そういったことなんだろうか」と考えるようになった。 秒速何万のレスポンスを捌ける機械学習の基盤とか、ユーザに価値を提供するレコメンドエンジン、もちろんそれらを作るのは面白かったし、就職するのも面白いと思う。ただ、僕の本心からの声を聞こうとしてないんじゃないのだろうか。

機械学習を勉強するにつれて、機械学習の限界が見えてくる。そして僕が最初に感じたワクワクを失っているような気がした。TwitterとかでAIに対する無茶な要求を見るたびに、「無理に決まってるだろう」なんて吐いていた。でも、なんで僕がそれを言えるんだろう。

自分ができること。その殻の中に無意識のうちに閉じこもっているような気がした。できることしかやらないし、できないことはできない。そう言い切ってしまったら楽だけど、その先に何が待っているんだろうか。

まだまだ若いのだし、大学に勉強した事を生かし、未知に到達してみたい。

そんなことを考え、今年の冬くらいからあえて未知なものをじっくり読むという事を行っていた気がする。わからないものを拒絶せずにじっくりと調べていくうちに、「コンピュータが意味を理解する」ということがどうやら僕の興味関心だなと思った。そのための具体的なタスクとして、Q&Aや、Word Embedding、また実データを使って構造を整理している研究室はないだろうか、と調べ、訪問することにした。(とはいえ、金銭的な面もあり、知り合いからすすめられたり、知り合いが現在行っているなどを参考にしながら決めた)

そこで訪問した順に並べると、

にいくことにした。NAISTは外部生から行きやすいという意味では入試は比較的入りやすいのでは、と思ったが、機械翻訳をメインにこれから力を入れて行きたいということで、それなら別の人が入るべきだなと感じてやめた。京大の僕が訪問した研究室も修士からの研究室であり、また、興味内容と合致しているなと思い、志望することにした。博士に進学希望の人が多い点も、いい研究室だからだろうと思った。複数受けようと考え、東工大のO研究室も訪問した。いい研究室だし、自分の興味と合致していると思ったものの、東工大の入試方式的に、僕が訪問した研究室は人気そうで、内部推薦で全ての枠が取られてしまうことを考慮に入れると、ちょっとそこに賭けるのは厳しいなと感じ、受けないことにした。結構悔しくて、GWに深く落ち込んだのを覚えている。

ということで京大一本。どう勉強したか、とかは受かったらまた書く。内部生のようにレジュメなどを持っていない上、専攻を変えることになるため、今まで勉強したことのない内容を必死こいて勉強する必要があった。正直相当しんどい。..とこれまでかなり大変で、周りが就職や、楽しそうなインターンなどを決めていく中で黙々と勉強するのは結構辛いものがある..と思いながら、TOEICの点に悩みながら(多分目標ラインまではたどり着けた)、なんとかここまできた。

-------

最近、「これだけ勉強して合格してもたった2年か」と思うようになった。小町先生の学生募集にもあるように、修士の2年で研究職につくのは難しいということ、そして自分の興味と研究意欲を考慮に入れると、博士に進学したいなと考えている。
大学院に落ちたとしたら、研究生として受け入れてもらえないかと言おうと思っている。学費を一年、生活費を一年払わないといけないのは厳しいが、それを考えなければ、B4から研究するのと同じくらいにテーマを掘り下げられる気もするので。まぁお金についてはお得意のプログラミングでなんとかしよう。
そんな感じでもう悟りの境地。これで落ちたらしょうがない。Twitter愚痴だらけ言ってた気がするけどその辺は申し訳ないです。


最近の気分。 [alexandros]も昔の曲の方がよく聞くかもしれない。

[Alexandros] - city (MV)



そういえばYANSが香川で今年は開催されるようなので、実家に戻るついでに参加しようと思っている(登壇はしません)。
参加される方はよろしくお願いします。

所感

一年ぶりくらいに考えをまとめるべく書く.
最近はどちらかと言うとアプリ開発だとかということよりも, 研究開発に寄っていて幸運にもpixivという会社が僕を雇ってくれたこともあり, pixiv社でオープンソースを開発している.
具体的にはJPEGを見た目の美しさを保ったままでより圧縮するアルゴリズムを開発するお仕事であり, 中々未知な部分が多いのではあるが, なんとか取り組んで行きたい課題だ. もうすぐしたらβ版くらいまでは出せるのではないだろうか.


...


最近の悩みは院進についてである.
来年以降自然言語処理についての研究をしたいと考えていて, NAIST, 京都大学, 東京工業大学と三つの大学をまわった.
個人的には東京工業大学京都大学に惹かれる部分を感じたのだが, 東京工業大学には入試の都合上, A日程とB日程という二つの日程に分かれ, A日程は事実上内部生のための推薦制度のようなものなのだが, これで定員の半数を受け入れることを院試説明会で初めて聞いた(僕はせいぜい一割か二割程度であろうと思っていたので寝耳に水だったが...)
また、志望する研究室はかなり人気になることが期待されるため, これではA日程で席が埋まり, B日程に席は一つも回ってこない可能性が考えられ, 仮にB日程を一位で通過したとしても, 諦めざるを得ない..という制度になりえてしまうのだ. 私の成績だとB日程に回されることは確実であり, 最初から勝ち目のない戦いなのかもしれない.

京都大学はというと, 決してそんなことはなく純粋にペーパーの成績で振り分けられるようである.
ただ, 僕が志望する研究室はおそらく第一人気となることはないと思われるが, それでも自然言語処理ができる研究室で有名であるため, おそらく合格者の中でも中位程度の成績を収めなければならないだろう.
合格したとしてもそれが最下位であったなら。 おそらくそれは辞退をする他選択肢はないだろう.


...


結局どこかに賭けるしかない.
最終的にはそこなのであるが, バンディットアルゴリズムを人生に適用できるほど僕はできていない.
落ちてしまったらどうしようかとか, やはりNLP(というかAIと言われる部門全体?)は人気であり, そう簡単にはいかないだろう...。
研究生として受け入れてもらえるか? はたまた, 落ちてしまった時点で就活をするのか?
仮に就職できたとしても, 僕はMachine Learningを続けられるのか? ...etc.

悩みは渦になってぐるぐると何度も頭の中を反芻する.


ステレオポニー - ツキアカリのミチシルベ

苦しいし, 険しい. 外部院進を誰もが敬遠する理由がわかるし, Hotな分野のせいというのもあるのかもしれない..
それでももうそろそろ賭けるべきを決めて、そこに一点注力をさせないことには希望の光は見えてこない.

そういうタイミングなのかもしれない.

大学二年生でweb系を1からサービスを立ち上げたりするまでに読んだ本

大学三年生になりました. 明日からまた学校なので, 2年生に読んだ本とかまとめてみようと思う.
ちなみに大学2年の段階ではweb系は全くで, 1年の12月くらいにC言語の本を読んだくらいの能力しかなかったけど,
それでも4~8月でサービスをデプロイするところまでは行けたので, 勉強することは多いけど気合いがあればなんとかなると思う.

4~6月

自分はロック音楽が好きで,ART-SCHOOLというバンドが好きなのだが,周りに同じような人がいなかった.
でも,周りの聞いているアーティストとかみてるとこっちも好きになってくれてもいい潜在的なファン(?)がいるように思えた..
ので,そんなサイトを作りたいなーとかちょっと考えたのがきっかけ.

HTML/CSSとかからスタートした.

作りながら学ぶ HTML/CSSデザインの教科書

作りながら学ぶ HTML/CSSデザインの教科書

これ結構分厚かったけど, 一からサイト作るって感じで分かりやすかった.
jQueryとかもちょろっと乗ってて次何をやればいいかとかも明確になった.
同時進行でPHPもスタートしていて,
いきなりはじめるPHP~ワクワク・ドキドキの入門教室~

いきなりはじめるPHP~ワクワク・ドキドキの入門教室~

気づけばプロ並みPHP 改訂版--ゼロから作れる人になる!

気づけばプロ並みPHP 改訂版--ゼロから作れる人になる!

この辺りも読んだ. これも一から作る感じでモチベーションは高く望めた(ただLAMPのバージョンがちと古すぎた気が..)
ショッピングカートの方は変数がたくさん出てきて少し混乱するところもあった気もする.

この辺でどうやら装飾をするならJavaScriptっていうのをやらないといけないなと気づいて,

これを読んで, なんかそのままこれも読んだ. この段階だと多分読まなくていい本なんだけど,
でも後々いろいろJSを触るときに今でも役立っているから読んでよかったと思う.
(JSのオブジェクト指向とかはちょっと違うからなぁと)
それで一応jQueryも読んだ.
改訂版 Webデザイナーのための jQuery入門

改訂版 Webデザイナーのための jQuery入門

わかりやすかった.

さて, この辺でPHPでサービスを作ろう!とはなったのだけれど, 実際にどこから書けばいいのか分からなかった.
調べていくうちにどうやらサービスを作るときは1から作るというより,フレームワークを利用するらしい.
CakePHPの本を読んだのだけれど, MVCがさっぱりな状態からだったので挫折. もっとわかりやすい本ないかなあと調べていたところ,

はじめてのフレームワークとしてのFuelPHP 改訂版

はじめてのフレームワークとしてのFuelPHP 改訂版

これが分かりやすかった.
一応パーフェクトPHPとかも文法を補うべく読んでた.
パーフェクトPHP (PERFECT SERIES 3)

パーフェクトPHP (PERFECT SERIES 3)

7月

なぜかリクナビに登録して, 福岡のベンチャー企業でペーペーなのにインターンさせていただくことに.
(今思うとよく通ったな..), PHPで働くのかと思っていると,その会社はRubyだったので,急遽Rubyを勉強した.
Rubyは書きやすく分かりやすかった.

作りながら学ぶRuby入門 第2版

作りながら学ぶRuby入門 第2版

Ruby, Web開発とくればRuby on Rails!となって, Railsをメンターの方に教えてもらいながら,conpassみたいなサイトを作った.
パーフェクト Ruby on Rails

パーフェクト Ruby on Rails

これだけだとアレだったので, 自分でもう一冊読んでた.
改訂3版 基礎 Ruby on Rails 基礎シリーズ

改訂3版 基礎 Ruby on Rails 基礎シリーズ

こっちの方が初めてなら分かりやすい.

この頃に自作したいアプリは, 機械学習っていうのが必要だ..!って気づいて,
機械学習ならPythonやれみたいな感じだったので,Pythonをはじめた. これがいい言語で, 今もメインで使っている.

Pythonスタートブック

Pythonスタートブック

入門 Python 3

入門 Python 3

ちなみに, はてなインターンは行けずだった。初心者だから当然と言えば当然..
この時に一回だけはてなのエンジニアさんとお話しできる機会があり, 「Web系と言えど基礎が大切」という話を伺った
その助言は今もずっと残っている

8月

ちょうどよく夏休みで, アプリの作り方もわかってきて, この夏に機械学習でロジック部分を完成させてアプリを出してやろうと考えていた.
まず数学を一年レベルはしっかり固めようということで,

微積(ラグランジュの未定乗数法は絶対にいる)

微分積分 (理工系の数学入門コース 1)

微分積分 (理工系の数学入門コース 1)

線形代数
プログラミングのための線形代数

プログラミングのための線形代数

統計学

そして機械学習. この本面白かった, おすすめ.

ITエンジニアのための機械学習理論入門

ITエンジニアのための機械学習理論入門

k-meansやら協調フィルタリングを駆使して, 自分なりに作ってインターンで発表した.
(今見るとなんでそのモデリングなのか不適切だが)高評価だったので嬉しかった.

www.slideshare.net


これは別のところで発表した資料.

9月

アプリ公開. herokuを利用した.

MusicLanguage

アーティストを打ったらおすすめアーティストをレコメンドしてくれるというもの.
はじめてのアプリということになりそう. 正直この月のことはあまり記憶に残っていない..

10月

大学の後期が始まり, 機械学習にのめり込むようになり, 最適化数学を勉強した.

これなら分かる最適化数学―基礎原理から計算手法まで

これなら分かる最適化数学―基礎原理から計算手法まで

この本は程よく数式があり, 具体例豊富でわかりやすく, とてもよかった.
Deep Learningにも手を出し始めたような気がする..。

定番中の定番.

基礎的な技術が身に付けたいと思い, 競技プログラミングを始めた.
あり本をICPCサークルの人と一緒に読み解いたりした.

このあたりでインターンをやめた
もっと学問として情報科学/計算機科学, 機械学習と向き合いたいと思ったからである

11~12月

あまり覚えていないが, DeepLearningにかなり傾倒していくようになり,
Chainerを利用してデータをぶち込んでぐるぐる回したり, あといろんなDeepLearningを試していたりした

Chainerによる実践深層学習

Chainerによる実践深層学習

実装 ディープラーニング

実装 ディープラーニング

Chainerはバージョンアップで内容が古くなってはいるが, 雰囲気を掴むにはいいかもしれない.

1~3月

親と相談して, 15ヶ月食費を抜きにしてDeepLearning用PCを購入することに成功した.
これにより, ようやくまともにビッグデータをぶちこめるようになった. 購入したのはGTX1070がついたBTOのPC. Ubuntu+Chainer+GPUのセットアップで苦労した.
この頃から, PRMLをしっかり読もう, もうそれしかないなと思ってPRMLを購入. この頃はとりあえず歯を食いしばって頑張っていたが, 最近になってようやくベイズ的考え方が身についてきたと思う. もうちょっと数学をやる必要は感じているが..

パターン認識と機械学習 上

パターン認識と機械学習 上

2月末にLINE BOT AWARDS用に「顔をみてそこから髪型をおすすめするアプリ」をDeepLearningで作り, コンペに提出した.
ファイナリストには残らなかったが, そのあとの後夜祭(4月)でLINE本社で発表する機会をもらえて嬉しかった.交通費も出たのはありがたい..
東京は楽しかったし, きている人のエンジニアのレベルが高いのが頭に残っている. LINEのインターンもいけたらいいな.

www.slideshare.net


4月のはブログに別でまとめている.

これからの予定

ニューラルネットワークに限らず, 機械学習/ベイズ推論/確率的プログラミングの基礎を勉強したい.
SICPみたいな本も読んでいきたい.
設計について深く考えたい.
競プロ力あげたい.
アプリ作りたい.

などなど. 基礎技術を勉強しながら手を動かしてアプリやツールも作っていきたいと思う.
OSSに貢献したりもやってみたいなぁ. まだまだこれからなので, どんどん勉強していきたいと思う

numpyについて2

インデキシング, ブロードキャスティングなどについて詳しく見ていく.

基本インデキシング

まず, numpyのデータに変数を与えることは普通の値を渡す状態なのではなく, 参照渡しであることに注意する.
つまり, ひとつのndarrayオブジェクトに変数を複数渡り当てた場合,ひとつの変数から値を変えると他の変数にも影響が出ることになる
これはビューといって, 余計なメモリを生み出さないための方法である.

In [1]: import numpy as np

In [2]: x2d = np.arange(12).reshape(3, 4)

In [3]: x2d
Out[3]:
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

# ここは, x2d[1, 1:]とも書ける(numpyのみ)
In [4]: a = x2d[1][1:]

In [5]: a
Out[5]: array([5, 6, 7])

In [6]: a[0] = -1

In [7]: a
Out[7]: array([-1,  6,  7])

In [8]: x2d
Out[8]:
array([[ 0,  1,  2,  3],
       [ 4, -1,  6,  7],
       [ 8,  9, 10, 11]])

応用インデキシング

先ほどのように, ビューが生成されるのではなく, コピーが生成される.
このため, メモリの量には気をつける必要がある.(大きいデータを扱うことがメインのため)

In [11]: dat = np.random.rand(2, 3)

In [12]: dat
Out[12]:
array([[ 0.98810811,  0.53605981,  0.80088131],
       [ 0.44439242,  0.4916097 ,  0.07521805]])

In [13]: bmask = dat > 0.5

In [14]: bmask
Out[14]:
array([[ True,  True,  True],
       [False, False, False]], dtype=bool)

In [15]: highd = dat[bmask]

In [16]: highd
Out[16]: array([ 0.98810811,  0.53605981,  0.80088131])

In [17]: highd[0] = 1000

# datには無影響である
In [18]: dat
Out[18]:
array([[ 0.98810811,  0.53605981,  0.80088131],
       [ 0.44439242,  0.4916097 ,  0.07521805]])

In [19]: highd
Out[19]: array([  1.00000000e+03,   5.36059805e-01,   8.00881315e-01])

整数配列でのインデキシングは, リストを渡すことによって可能である

In [24]: nda = np.arange(10)

In [25]: ndb = nda[1:4]

In [26]: ndb
Out[26]: array([1, 2, 3])

In [27]: ndc = nda[[1, 2, 3]]

In [28]: ndc
Out[28]: array([1, 2, 3])

浅いコピー, 深いコピー

numpyには浅いコピーと深いコピーがある.
浅いコピーには参照が渡される. 基本インデキシングはこちらになる.

深いコピーでは, 値が渡されるので, 元々のデータと別物になる.
応用インデキシングで見せた, ブール配列によるインデキシングや, 整数配列によるインデキシングだけでなく,
copy()メソッドや, flatten(一次元にする), a.clip(min, maxを指定し, min以下のものはminへ, max以上のものはmaxへ)などもこちらに属する

ufunc. ユニバーサル関数について

numpyには, map関数として配列の要素のそれぞれにアクセスして特定の処理をして返す関数があり,
ユニバーサル関数と言われる.

In [30]: nda = np.arange(12).reshape(2, 6)

In [31]: nda
Out[31]:
array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11]])

In [32]: np.square(nda)
Out[32]:
array([[  0,   1,   4,   9,  16,  25],
       [ 36,  49,  64,  81, 100, 121]])

既存のpythonの関数を, frompyfuncを利用することによってufunc化することもできる

In [34]: hex_array = np.frompyfunc(hex, 1, 1)

In [35]: hex_array((10, 30, 100))
Out[35]: array(['0xa', '0x1e', '0x64'], dtype=object)

ブロードキャスティング

  1. , /, *, -などの計算は, 同じ大きさ同士のものでなければ計算することはできない.

この点を解消してくれるのが, ブロードキャスティングである. これが結構ややこしい(というか, 言葉にするより図に書くべきだと思う).
詳しくは, ここをみてほしい

In [36]: nda = np.arange(24).reshape(4, 3, 2)

In [37]: ndb = np.arange(6).reshape(3, 2)

In [38]: ndc = np.arange(3).reshape(3, 1)

In [39]: nda + ndb - ndc
Out[39]:
array([[[ 0,  2],
        [ 3,  5],
        [ 6,  8]],

       [[ 6,  8],
        [ 9, 11],
        [12, 14]],

       [[12, 14],
        [15, 17],
        [18, 20]],

       [[18, 20],
        [21, 23],
        [24, 26]]])

この例だと, ndaに合わせていく形になり, ndb, ndcの次元を一つ増やして3にする. あいているところは, 今と全く同じベクトル/行列で埋める.
次に大きい軸(z, x, y)ならyで埋めていくと, nbcは(4, 3, 2)の形にまで大きくすることが可能. これにより, (4, 3, 2)を出力の行列として計算することができる. このように, ぴったりと埋まらない場合にブロードキャスティングでエラーが発生する. 例えば, 以下の例である.

In [47]: nda = np.arange(12).reshape(3, 4)

In [48]: ndb = np.arange(4)

In [49]: nda + ndb
Out[49]:
array([[ 0,  2,  4,  6],
       [ 4,  6,  8, 10],
       [ 8, 10, 12, 14]])

In [56]: ndb.reshape(4, 1)
Out[56]:
array([[0],
       [1],
       [2],
       [3]])

In [60]: nda + ndb
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-60-c79787edb196> in <module>()
----> 1 nda + ndb

ValueError: operands could not be broadcast together with shapes (3,4) (4,1)

言葉より図をかいて考えるべきだった..

numpyについて

numpyとは,配列の処理に特化したライブラリで, Pythonのそれよりも高速に処理することができる.
行列演算を簡単に, 高速に行うことができるものであり, 以下の3つの機能を提供している.

(1)ユニバーサル関数
(2)各種関数群
(3)C/C++など, 他言語へのインターフェース

numpyが高速な理由の一つに, RAMのメモリに配列のデータがびっしりと敷き詰められるから, というのがある.
こういう形にすることで, オーバヘッドを抑えることが可能になる.

numpyの組み込みデータ型

組み込みデータ型はたくさんある. 数値を扱うものが大半だが,pythonのオブジェクトを格納するものもある.
これらを使って以下のように書く.

import numpy as np

# 組み込みデータ型(配列)の形で生成する
a = np.complex128([3.2, 4.2+1.09j])

# np.array()で生成し, dtypeに属性を付加することもできる
b = np.array([2234.432, 2.23], dtype=np.single)

多次元配列オブジェクトndarrayについて

Pythonのオブジェクトには, 配列と行列があり, これらを区別して使用しなければならない
たとえば, S = (HVH^T)^-1という行列を計算するとき,以下のような書き方ができる.

# 行列を利用する
import numpy as np

H = np.matrix([[1, 2], [3, 4]])

V = np.matrix([[3, 4], [5, 6]])

S = inv(H * V * H.T)

行列を使えば直感的にかけるが, 配列とごっちゃになる可能性があるので, あまり使用しない.
Python3.5~からは, 配列でも同様に演算できるように @演算子が追加された

import numpy as np

H = np.array([[1, 2], [3, 4]])

V = np.array([[3, 4], [5, 6]])

#従来
S = inv(H.dot(V.dot(H.T)))

#python3.5~
S = inv(H @ V @ H.T)

行列は原則使用しないようにする

ndarrayの生成

pythonのリストやタプルは, そのままnp.array(..)にいれることで, ndarrayオブジェクトに変換できる.
しかし, pythonの配列と違い, いくつか注意点がある

(1) 基本的に同じ型になる
(2) 各次元の要素数が同じ

import numpy as np

mat = [[3, 1, 9], [2, 5, 8], [4, 7, 6]]

array1 = np.array(mat)

その他, arrayだけでなく, arange, one, zerosなどがある.
ones, zerosは1のみ, 0のみの行列を生成する. np.zeros(行, 列)で指定する
arangeはrangeと同じで, (start, end, step)で指定する.

import numpy as np

a = np.zeros(2, 3)

b = np.arange(10, 20, 2)

np.arange(..)は浮動小数点も可能だが, そのときendの値が入ってしまうことには注意しておく.

データ型の指定

(1) Generic Typeによる指定
(2) Pythonの組み込みデータ型に対応する型指定
(3) numpyの組み込みデータ型による指定
(4) 文字コードによる指定

がある. 個人的には(3)が一番使われているような気がする

import numpy as np

dt = np.dtype('float')

# データ型のdtypeオブジェクトを引数に
x = np.array([1.1, 2.1, 3.1], dtype=dt)

# 文字で指定することも可能
x = np.array([1.1, 2.1, 3.1], dtype='float')

numpyの属性

numpyには行列演算のメソッドとは別に, ndarrayの状態を取得する属性群がある.
その中でも, 今回はshapeとndimに焦点を当てる(最初ndimがわからなかった)

import numpy as np

mat = [[3, 1, 9], [2, 5, 8], [4, 7, 6]]

array1 = np.array(mat)

array1.shape
# => (3, 3)

array1.ndim
# => 2

shapeは行*列でタプルで返す関数である.
ndimは, 行列の次元数であり, ベクトルなら1, 行列ならば2, 3次元のテンソルなら3..となっていく.

ndarrayの行列演算

行列演算について, ndarrayの+, -, *, / などの演算は要素同士の演算になることに注意をする.
もし, 行列積を出したいときは, dotか@演算子を使って演算すること.
逆行列演算や, 行列式計算, ランク計算はnumpyで簡単に計算できる

In [32]: np.linalg.inv(mat)
Out[32]:
array([[ 0.23214286, -0.50892857,  0.33035714],
       [-0.17857143,  0.16071429,  0.05357143],
       [ 0.05357143,  0.15178571, -0.11607143]])

In [33]: np.linalg.det(mat)
Out[33]: -112.00000000000006

In [34]: np.linalg.matrix_rank(mat)
Out[34]: 3

インデキシング以降を明日に見ていく.

ファイル入出力のあれこれ(pandas編)

pandasはデータを扱うためのライブラリである.
テキストファイルやらデータベースとの入出力が簡単にできる. 今まで見てきたcsv, excel, hdf5なども取り扱うことができる.
read_...()という形なのでインターフェースもわかりやすい.

pandasが優れているところは, 欠損データだったり意味のないスペースなどのファイルの異常にも対応できるということである.
なお, 大規模計算にはhdf5が最速でデータを読み書きできるのでそちらを利用するほうが良いとのこと.

今回のデータがこれ.

# テストデータ 2016/1/10, encode=utf-8
time;status;高度;速度
0;search;125
0.1;search;1012.5; 128.5;
0.2;lock;1035.3; 130.5987
0.3;lock;1068.365; 135.45
0.4;lock;1090.2; NaN

こんな形でデータがある. これを整形していくことを考える.
今回はutf-8で扱う. 元々の科学技術計算のためのpython入門にはcp932だったがまぁ...そこは.

(1)encodingを確かめる
utf-8なので, 普通に読む.

import pandas as pd

dat = pd.read_csv('data.csv', encoding='utf-8')

一行目を消し, デリミタとして';'を設定する.

dat = pd.read_csv('data.csv', 
                               encoding='utf-8',
                               skiprows=1,
                               seq=';'
                               )

これで概ねよくなるが, データに意味のない空白があるので, それを取り除く.

dat = pd.read_csv('data.csv',
                                encoding='utf-8',
                                skiprows=1,
                                seq=';',
                                skipinitialspace=True)

これでおめあてのデータにすることができた.