山下寛人オフィシャルブログ

オイシックス株式会社 執行役員 システム本部長 山下寛人の公式ブログです。

ndarrayのちょい技2

今度は2次元配列で、ある列が条件を満たす行だけを抽出するサンプルです。
SQLのwhereのようなことをするイメージです。
numpyはnpとしてimportしておきます。

data = data[np.where(data[:, 0]<1600)]

解説します。
data[:, 0]は、0列目を全部の行数分取り出します。

>>> data[:, 0]
array([ 1944.3333,  1501.    ,   778.    , ...,   160.    ,  3202.6667,
        2566.5   ])

data[:, 0]<1600とすると、それぞれの値が1600未満かどうかでTrue,Falseに変わります。

>>> data[:, 0]<1600
array([False,  True,  True, ...,  True, False, False], dtype=bool)

np.where()はTrueになっている要素の位置のリストを返します。

>>> np.where(data[:, 0]<1600)
(array([   1,    2,    5, ..., 4994, 4996, 4997]),)

0番目がFalseなので1,2・・・となっているわけです。
最後にdata[]の添字に渡すと該当する行だけの2次元配列になります。

>>> data[np.where(data[:, 0]<1600)]
array([[ 1501.    ,  2817.    ],
       [  778.    ,  4384.    ],
       [  181.    ,  5091.7   ],
       ..., 
       [ 1230.    ,  4451.    ],
       [ 1172.3077,  2340.8462],
       [  160.    ,  3993.6667]])

pandasでも同じようなことが簡単にできるようなのでやってみようと思います。

ndarrayのちょい技

最近オイシックスPythonをやっております。scikit-learnなどで機械学習など手を付けています。

scikit-learnをやる前にnumpyを覚えておくといろいろ便利です。for分でごりごりループして書いたりするよりこんなことできないかなと思ったらだいたいできますね。そんなふうにして見つけた技を紹介します。

2次元の配列dataがあったとします。numpyはimport numpy as npとしてインポートします。

・多次元配列からの無作為抽出

data = data[np.random.choice(data.shape[0], 5000, replace=False), :]

random.choiceは無作為抽出をしてくれます。が、1次元配列からしかできません。最初の引数に配列でなく整数を渡すとその数値までの配列を作ってそこから無作為抽出をします。それを利用して抽出する列番号を出して取り出します。
data.shapeは配列の各次元の大きさを表示します。2次元だと何行で何列です。

>>> data.shape
(92568, 2)

92568行から無作為に抽出します。なので最初の引数はdata.shape[0]になります。
2番めの引数は何個取り出すか。ここでは5000個としています。
replaceという引数は、重複を許すかどうか。デフォルトだと重複ありなのでFalseを指定します。

>>> np.random.choice(data.shape[0], 5000, replace=False)
array([47794, 78156, 42097, ..., 10104, 47779, 89019])

こんな具合で取り出す行番号がランダムに5000個出てきます。
これを最初の添字にして2番めはコロンにしておくとその行の要素全部という意味になり、無作為抽出になります。

>>> data[np.random.choice(data.shape[0], 5000, replace=False), :]
array([[ 1115.2   ,  2746.    ],
       [  351.3333,  4032.1667],
       [ 2077.5385,  2192.6154],
       ..., 
       [  964.1   ,  3427.1   ],
       [ 1587.    ,  3405.5   ],
       [ 1037.5385,  5365.0769]])

うまくできました。

サーバーサイドSwift Kitura

www.publickey1.jp
気になるサーバーサイドSwiftIBMがwebフレームワークを出したそうです。IBMはそっちがわで行く作戦なのですね。IBMクラウドでしか使えないんでしょうか。と思ったところこんな記事もありました。
Swift で書ける Web フレームワーク「Kitura」を触ってみた | Developers.IO
これを見るとローカルで動かしているのでIBMクラウドでしか使えないというわけではなさそうです。Paasなんでセットアップが簡単ということなんでしょうね。コード見る限りはnode.jsぽいです。まだまだプリミティブな感じなんで実用はまだ先ですかね。

共有フォルダ上のファイルがMacで開けない時

会社内でWindowsMacでファイルを共有しているとまれにMacでファイルが開けないときがあります。ExcelファイルなどをFinderから開こうとすると、ファイルが見つからないといったエラーになります。ローカルにコピー&ペーストしようとしても同様です。ターミナルでlsコマンドでファイルを表示させることはできます。しかしcpコマンドでコピーしようとするとやっぱりファイルが見つかりません。

こういうファイルの特徴はMac側ではわかりませんが、Windowsコマンドプロンプトでdirで表示させてみると、濁点・半濁点が分かれています。例えば通常であれば「プラン.txt」というふうになっていますが、Macから開けないファイルは「フ゜ラン.txt」というふうになっています。

なぜこういうふうになるかというと、調べてみたところ、MacWindowsもファイル名はUTF-8ですが、濁点・半濁点の扱いが違うようです。Macは濁点・半濁点は分けて管理しています。Windowsは分けないで濁点・半濁点が1文字に含まれる形で管理しています。

通常のファイルのやり取りは濁点・半濁点を含むファイルでも問題なくやり取りできているので、ファイルサーバーがこの変換をしていると考えられます。オイシックスではファイルサーバーはQNAPを使っています。なので内部的にはsambaです。

しかしどういうわけかWindowsから見て濁点・半濁点が別れた形でファイル名ができてしまう場合があり、その場合にMacからアクセスしに行ったときにsamba内部で濁点・半濁点をくっつけてしまい実際のファイル名と一致しなくなり、ファイルが見つからないというエラーになっていると予想できます。

いろいろ試した結果再現できました。
Macで濁点・半濁点含むファイルを作成→gmailで送信→Windowschromeでメールを受信、添付ファイルを保存→濁点・半濁点が別れたファイル名になる→共有フォルダに置く

google drivewindowsに渡した場合はちゃんと変換されました。

ではこういうふうになってしまったファイルはどうしたらよいか。nfd2cというプログラムをwindows側から動かすと変換できました。
d.hatena.ne.jp
無事Macでファイルを開けるようになりました。

Mac側から何とかする手段はちょっと思い当たらないです。なんせファイルが見えないので。

MacWindowsのファイル名の濁点・半濁点を統一するか、gmailでダウンロードするときに変換するか、sambaでうまいこと対応するか、してもらいたいです。ここまで調べるの大変でした。

会社でMacを使うときのTips

細かいけどちょっと快適になる技です。でもみんな同じ現象があるわけではなさそうなので自分だけかもしれません。

Windowsベースの会社でMacを使うと共有フォルダやMS Officeを多用することになります。さらにWifiで会議室に持って行ったりいろんな場所に持って行ったりするとネットワークの接続が一時的に切れたりします。そうするとMS Officeがハング状態になったりします。

もしそうなったら「最近使ったファイル」を消してみましょう。
Excelの場合。
画面上の「Excel」→「環境設定」→「全般」→「最近使用したドキュメントの一覧に表示するドキュメントの数」左のチェックボックスを外す

最近使ったファイルをスキャンしに行ってるんでしょうか。少しでも快適になれば幸いです。

さよならデータセンター

昨日メインのDBサーバーのクラウドへの移行が終わりました。もう少し残っているサーバーもありますが1、2ヶ月のうちに全部なくなるでしょう。

なんだかんだで創業のときからずっと同じサーバーラックで15年半くらいやってきました。最初1ラックでそのまま隣に増やしたので最初のサーバーラックは本当に15年使い続けました。最初はPSI netという会社でした。それがC&WになりソフトバンクIDCになりIDCフロンティアになりました。オーナー変わりすぎです。

もっと安いところが見つかって引っ越そうというプランも何度か持ち上がりました。その度に引き止めにあい値下げしてくれたので引っ越すことはありませんでした。今回もAWSに移ることを画策していましたが引き止めにあいAWSに移るうえでのボトルネックをクリアするプランを出してくれたのでIDCFクラウドになりました。

時代がどんどん変わっていることを改めて感じますね。

感慨深いものがある一方で昔のものに固執するつもりはなくむしろどんどんいいものに変えていきたいと思っています。あとはECサイトの独自フレームワークとその上のプログラムですかね。

教えるとスキルが上がる

ワーク・ルールズ!―君の生き方とリーダーシップを変える

ワーク・ルールズ!―君の生き方とリーダーシップを変える

ワーク・ルールズ読みました。Googleの人事の人が書いた本です。採用から育成、マネジメントまで人事でやっていることを紹介してくれています。
人事なんだけど学術論文にヒントを得て施策を考えたり、徹底して数値に基づいて分析してABテストして効果測定しているところなどさすがGoogleだと思いました。
中でもスキルアップのためには教えるのが一番と書いてあってなるほどなと思いました。去年からJavaScriptをよく教えているのですが自分のJavaScriptスキル上がったと思います。身を持って実感してます。