10分で学ぶNumPy速習チュートリアル2017-08-1110分で学ぶNumPy速習チュートリアルNumPyは、Pythonで多次元配列を扱う数値計算ライブラリです。NumPyを使うことで研究のプロトタイプを簡単に実装できる数多くのライブラリを使い、高度な機能をシステムに組み込める高速な行列計算ができるなど様々なメリットがあります。本記事では、NumPyに興味を持っている人や簡単にでも使えるようにしたい人向けに一通り読めばどのような機能があり、便利なのかを知ることができるように書いています。本記事を参考にして、日々の業務や研究に活用してください。NumPyを使ってみようまずはPythonを立ち上げます。python3まずはNumPyをインポートします。慣例としてNumPyはnpとしてインポートすることが多いです。np次に簡単な配列を作っていきます。3])はい、これで配列が1つ完成です。配列同士で足し算や掛け算をしてみます。5])このように数値を掛けたり足したりすると配列のすべての要素に対して演算が行われます。数値演算について詳しく知りたい方は以下の記事を参照してください。/features/numpy-math.htmlこれをブロードキャストと言います。大事な概念なので別の項で取り上げます。1つ配列を作ってみます。0])今度は配列同士で演算を行ってみましょう。0])0で要素を割ってしまったので怒られてしまいました。配列同士で*を使って演算をすると各要素同士の掛け合わせが出力となります。このような積をアダマール積と呼びます。行列のような内積をしたかったらnp.dot()関数というのを使うと良いでしょう。np.dot(a,b)6この関数の詳しい使い方は以下の記事を参照してください。/features/numpy-dot.html様々な配列を作る次に関数を使っていろんな配列を作ってみましょう。決まった数までの連続した値を作ります。9])ちょっと細かく指定してみます。0~10までを2ごとに区切ります。8])お気づきの人も多いかと思いますが、NumPyのarange関数では終点に指定した値は基本含みません。次は決まった区間を15等分してみます。linspace関数を使います。])arange関数やlinspace関数についての詳しい記事はこちら。/features/numpy-linspace.html次は2次元配列を作ってみましょう。以下のようにリストを並べたリストの形式で記述しています。6]])これが2次元配列です。配列の形状の表し方は線形代数の行列と一緒で2×3となり、タプルで(2,3)と表されます。これは配列.shapeを実行することで確認することができます。3)3次元配列も作ることができます。3)と、なっています。いろんな見方があると思いますが、4×3の行列が2つ並んでいると見ることができます。shapeについての詳しい記事はこちら。/features/numpy-shape.htmlここには軸(axis)の考えなども混ざってきます。np.sum(c)21列ごとの和を知りたい時、以下の様に軸(axis)を指定するとうまくできます。15])このような軸や次元の詳しい解説は以下の記事を参考にしてください。/features/numpy-axis.htmlまたこの配列の形状を変える事もできます。reshape関数を使って変えてみましょう。[6]])また転置を行うこともできます。やり方は様々ですが、配列.Tの形やtranspose関数で求めることができます。6]])reshapeや転置についての詳しい記事はこちら。/features/numpy-transpose.html次に乱数を発生させてみます。np.randomクラスにいろんな乱数を発生させる関数が実装されています。randn関数が標準正規分布に従った値を返し、rand関数は0~1までの値の中で乱数を返します。np.random.rand()0.8549776402949295()の中で形状を指定することで任意の形状の配列の要素を乱数で埋めたものを出力することができます。0.35771574]])乱数関数については以下の記事で詳しく解説しています。/features/numpy-random.htmlインデックスとスライシング配列の中の特定の値を抜き出したいときはインデックスとスライシングを使います。スライシングは少しクセがあるので注意してくださいね。インデックスを使ってみましょう。一次元配列から試してみます。3])このように、先頭の要素のインデックスは0になっています。インデックス機能を使って配列の特定の値だけを変更することが可能です。2次元配列で見てみます。c[1,2]6最初の数字で縦方向のインデックスを、次の数字で横方向のインデックスを指定しています。次にスライシングです。これは複数の要素を抜き出すときに使うものです。新たに配列dを設定してスライシングを使ってみます。2])[始点:終点]の形で指定しますが、終点として指定されたインデックスは含まれないことに注意してください。0])このように使うことができます。覚えておくとよいですよ。スライシングについてもっとよく知りたい方は以下の記事を参考にしてください。/features/numpy-slicing.htmlブロードキャスティングこれはNumPyの代表的な特徴の1つであり、使いこなせるようになるととても便利です。配列の形状にあわせて適宜配列を拡張してくれる機能となっています。何言っているのかよくわからないですよね。実際のコードを見てもらったほうが早いと思うので早速みていきましょう。18]])見てわかるでしょうか。aの配列が2回繰り返されることでcへの足し算を行っていることが。aがcの形状にあわせて拡張(この場合は行方向に要素が1回繰り返される)されたあと、通常の足し算や掛け算を行っていることになります。ブロードキャストについて詳しく知りたい方はこちら。/features/numpy-broadcasting.htmlNumPyの高速演算NumPyがどれだけ早く計算できるのかを率直なPythonコードと比較して実際に確かめてみます。sec上記の場合では1.5倍ほど高速に演算できていることがわかりました。配列のサイズを大きくすると以下のようになります。次はIPythonの%timeitを使って計測してみます。each)明らかな速度差が見て取れます。NumPyは上手に使うと格段に高速化できることがあるので、アプリケーションが遅いときなどにも便利に使うことができます。DeepAgeではAIに関する厳選した内容を記事にしてお届けします。