へっぽこエンジニア@機械学習

へっぽこなエンジニアがへっぽこなりに機械学習の習得に取り組む過程で得た知識について書いたブログです。実装に際してハマった点や、基礎的な内容についての記載が中心ですが、徐々に高度化させて行ければと思っています。非へっぽこの方からは間違いの指摘など頂ければ嬉しいです。

numpyの演算中に<built-in method sum of numpy.ndarray object at .....>と表示された時の対処法

簡単な処理の確認をpythonの対話モードで実行している時、表記に出会いました。
結論から言うと非常に簡単なミスでしたが日本語の記事に直ぐに出会えなかったので記録の為に残しておきます。

例えば、numpyのsquare.sumの動作を確認してみましょう。

f:id:growingEngineer:20191219041152p:plain


変数bの内容が確認したかったのですが、これでは確認ができません。
正しくは以下です。

f:id:growingEngineer:20191219041322p:plain


sumの後に()を入れるべき所、ミスで()が抜けていました。
非常に簡単ですが、以上です。

OpenAI mujocoにおけるXMLファイルの扱い(contype・conaffinityついて)

OpenAIのmujocoで新たな環境を構築する際、必要となるのがMJCFという形式のXMLファイルの記述です。
基本的には既存のXMLファイルをコピーして編集するのが良いと思いますが、いざ動かしてみると物体間の接触が思うように行かずハマりました。
MJCFのReferenceとしては下記のものがあり、今回はこのReferenceを見ながら試行錯誤し学んだ内容についてメモを残しておきたいと思います。

www.mujoco.org


・contypeとconaffinity
2物体を衝突(接触)させたい時、一方の物体のcontypeともう一方の物体のconaffinityを一致させておく必要があります。
サッカーを例にあげると、プレイヤーのcontypeを"1"とした場合にサッカーボールのconaffinityも"1"にしておかないといけないという事になります。
ボールのconaffinityが"0"だとプレイヤーは一生ボールに触れる事ができません。

簡単ですが以上です。
いつか時間があれば簡単なシミュレーションをやってみたいと思います。

エンジニアがMacを使う理由

◆背景
これまでMacには興味がありつつWindowsLinuxの使用経験しかありませんでした。
Macの導入に踏み切れなかった、機会がなかった理由は主に以下です。

・事務作業→結局Office形式の提出が多いのでWindowsをつかう。
・コード開発→Windowsマシン上の仮想マシン or デュアルブートで開発を行う事ばかりであった。

PCを買い換えるタイミングにWindowsマシンを買おうか、ずっと気になっていたMacにしてみようか散々悩みました。

Macを買う利点を求めて色々とググってみても自分の中で腹落ちする 記事に出会えなかったのですが、
「使ってみないと良し悪しも分からない!」
「SEのMac率は高いので何か困ってもググったら対処できるはず!」
と言い聞かせてMacを購入しました。

◆結論
いきなり結論ですが、使い初めて1年以上が経過した今では「正しい選択だった!!」と思っています。
Macの購入を迷われているエンジニアの方の参考になればと思い記事として残しておきます。

◆お断り
あくまで「へっぽこ」なエンジニアの意見です。
非へっぽこ の方の指摘、追加情報をお待ちしております。

◆良い点(と思っている) 
1. ".bashが使える"
2. "vimが使える"

上記二点はコーディングを日常的に行う人にとっては最も大切な事だと思います。
windowsにはcygwinがあるじゃ無いか」という声も聞こえますが、ビジュアルをあまり気にしない自分でもcygwinの見た目は残念ながら自分にはあまり合いませんでした。
また、ディレクトリ構成に癖があり(自分の設定が悪い?)ファイルの移動なども直感的にできなかったのもcygwinの使用を即座に辞めてしまった理由です。
その為、コード開発の際にはwindows上の仮想マシンUbuntu(Linux)を立ち上げ、別途立ち上げたTeraTermから仮想マシンSSH接続、TeraTerm上でvimを使ってコーディング、またmakeなどをしていました。
この方法では「コーディングしたい!」「ちょっとpythonで計算したい」「vimでメモを取りたい」なんて時に利便性を損なう一番の理由だったと思います。
(Windows10からは bash on Windowsが使えると思うので、そこらへんが解消されていれば良いかもしれません。)

ちなみに自分はAlfredというランチャーアプリを入れ、ターミナルとしてはitermというアプリを使用しています。
Alfredをショートカットキーで起動し、"it..."くらいまで入力するとitermが起動できるので直ぐにコーディングを開始する事ができて非常に便利です。
また、サーバーマシンにsshで入って・・・なんて事も5秒以内です。

www.alfredapp.com

www.iterm2.com


コーディング以外の事務作業でも以下の点が気に入っています。

3. "周りにユーザーが多く、トラブルの対処方法を聞くことができる"
4. "iPad, iPhoneとの連携がよい。iMessageやair Dropなど"

特にapple製品の連携は素晴らしく、もうappleにがっつり囲われてしまった感覚があります。
自分はMacbook air, iPad, iPhoneを使っていますが、連携の便利さを一番感じるのはMessageとair Dropです。


これまで家族との連絡はLINEを使っていましたが、家族もiPhoneユーザーなのでiMessageなどで連絡を取る様にお願いしています。
自分のiPhone宛てににiMessage経由で連絡をもらったとき、Macbook airでもメッセージが表示され、そのままMacのキーボードで返信をする事ができるので、
iPhoneに視線を移す必要がありませんし、文字を打つ速度も早く作業効率が落ちにくいと思います。


何よりファイル共有が非常に楽です。
Macbook airのファイルをLINEで友達に送りたい、iPhoneで撮った写真をMacbookに取り込みたいという時にair Dropによって非常に効率的にファイルを移動させる事ができます。

◆欠点
充電器ですが、新しいMacはUSB-Cが採用されているので心配する必要は無いかもしれません。
自分のMacbook AirはMag Safe2が搭載されているのですが、以下の懸念点があります。

・オフィスと自宅用に充電器が2つ欲しい(時々忘れて悲惨な目にあう)
・そもそも断線しそうで怖い

かといって充電器もなかなかいいお値段するので2つ目の購入には至っていません・・・
今の充電器をなるべく痛めない様に毎回ケースに入れて持ち運び、使うときも丁寧に扱う様にしています。

◆まとめ
へっぽこなエンジニアが予てより気になっていたMacを思い切って購入し、1年以上使ってみて感じた利点を書いてみました。
今の所大きな不満な点は無いので、へっぽこ的にはオススメです。
他に気が付いた点があれば追記していきたいと思います。
Macの購入を検討されている方の助けになれば幸いです。

ndarrayで条件にあう要素のみの和(加算)を求める際の注意点

ndarrayの中で特定の条件にあう要素のみの和を求めたいとき、

例えば以下のndarrayを考える。

f:id:growingEngineer:20190314093146p:plain

例えば0以上の要素の和を求める時、正解は'55'だが以下の様な誤ったケースがある。

f:id:growingEngineer:20190314093410p:plain

上記では和ではなく、条件を満たす要素数をカウントしてしまっている。

それは以下の挙動から分かると思う。

f:id:growingEngineer:20190314093526p:plain

カッコ内はTrue/Falseを出力するので、それをsumするとTrue(=1)を足してしまうのだ。

(間違ってたらごめんなさい)

 

正しくは以下の通り。

f:id:growingEngineer:20190314093726p:plain

 

ブロードキャストを活用して1次元のndarrayと2次元以上のndarrayの演算する際の注意点

ブロードキャストとは、pythonの機能で行数、列数が異なる配列同士を上手に補完して演算してくれるものである。

例えば、以下の様なarrayを用意する。

f:id:growingEngineer:20190314085203p:plain

a,bは行数は同じだが列数が異なる。

こう行った際にa-bを行うと、以下の様な結果が得られる。

f:id:growingEngineer:20190314085403p:plain

この様に本来(5,1)のサイズであるbが、あたかも(5,5)の様に振舞って四則演算をしてくれる機能こそがブロードキャスト。

 

初心者の自分が引っかかったのが以下の様なケース。

cは一見bと同じに見えるが、それぞれサイズが異なりb(5,1), c(5,)である。

f:id:growingEngineer:20190314085712p:plain

このままa-cを実行するとブロードキャストは適用されずエラーを返される。

f:id:growingEngineer:20190314085935p:plain

aとbは2次元配列なのに対して、cは1次元配列の為ブロードキャストが適用されない。

次元の違いは以下の様に確認できる。

f:id:growingEngineer:20190314090257p:plain

a-cを計算したい時には、以下の様にcをreshapeし2次元配列にしてやれば良い。

f:id:growingEngineer:20190314090609p:plain

なお、上の例では演算時のみreshapeをしており元のcには変更が加わっていない事が分かる。