Numpyについて
numpyは「Numerical python」の意味でPythonの数値計算における最も重要な基本パッケージです。
機械学習ではベクトルや行列、テンソルなどのデータ構造が頻繁に使用されます。Numpyはこれらのデータ構造を効率よく高速に実行できます。
Numpyのドキュメントでは次のような説明になっています。
NumPyは、Pythonでの科学計算のための基本的なパッケージです。これは、多次元配列オブジェクト、さまざまな派生オブジェクト(マスクされた配列や行列など)、および配列の高速演算(数学、論理、形状操作、並べ替え、選択、I / Oなど)のためのさまざまなルーチンを提供するPythonライブラリです、離散フーリエ変換、基本的な線形代数、基本的な統計演算、ランダムシミュレーションなど。
また、これらのデータ構造でよく使われるワードを覚えておきましょう。
- スカラー:単なる数値
- ベクトル:スカラを集めてまとめたもので、1次元の配列
- 行列:スカラーを、タテヨコに並べたもので、2次元の配列
- テンソル:スカラを3次元以上にまとめたもので、3次元以上の配列
Numpyのインポート
Numpyの呼び出しをimport numpy as npに統一すべきです。 from numpy import *とすることはpythonの組み込み関数と名前空間が重なる可能性が高くなります。そのためスコープは分けておくべきです。
Numpy の一般的なインポート方法
import numpy as np
「%precision 3」はマジックコマンドで、Jupyter Notebookだけで使えるものです。 この場合は小数以下3桁まで表示を表します。
なお、pandas.DataFrameの結果には使えません。
Numpy配列の作成方法
Numpy 配列を作成するには、np.array関数を使います。
data = np.array([9, 2, 3, 4, 10, 6, 7, 8, 1, 5])
Numpy 配列を作成するには、それぞれの要素の型を整えておく必要があります。
Numpy の型には次のようなものがあります。
データ型`dtype` | 型コード | 説明 |
---|---|---|
`int8` | `i1` | 符号あり8ビット整数(-128 ~ 127)型 |
`int16` | `i2` | 符号あり16ビット整数 (-32768 to 32767)型 |
`int32` | `i4` | 符号あり32ビット整数(-2147483648 to 2147483647)型 |
`int64` | `i8` | 符号あり64ビット整数 (-9223372036854775808 to 9223372036854775807)型 |
`uint8` | `u1` | 符号なし8ビット整数 (0 ~ 255)型 |
`uint16` | `u2` | 符号なし16ビット整数(0 ~ 65535)型 |
`uint32` | `u4` | 符号なし32ビット整数(0 ~ 4294967295)型 |
`uint64` | `u8` | 符号なし64ビット整数(0 ~ 18446744073709551615)型 |
`float16` | `f2` | 半精度浮動小数点型(符号部1ビット、指数部5ビット、仮数部10ビット) |
`float32` | `f4` | 単精度浮動小数点型(符号部1ビット、指数部8ビット、仮数部23ビット) |
`float64` | `f8` | 倍精度浮動小数点型(符号部1ビット、指数部11ビット、仮数部52ビット) |
`float128` | `f16` | 四倍精度浮動小数点型(符号部1ビット、指数部15ビット、仮数部112ビット) |
`complex64` | `c8` | 複素数(実部・虚部がそれぞれ`float32`) |
`complex128` | `c16` | 複素数(実部・虚部がそれぞれ`float64`) |
`complex256` | `c32` | 複素数(実部・虚部がそれぞれ`float128`) |
`bool` | `?` | ブール型(`True` or `False`) |
`unicode` | `U` | Unicode文字列 |
`object` | `O` | Pythonオブジェクト型 |
明示的な型の指定
np.array関数でNumpy配列を作成するときに、型を明示的に指定できます。
指定方法は次のように3種類の方法があります。
dtype = np.int64
dtype = ‘int64’
dtype = ‘i8’
data = np.array([9, 2, 3, 4, 10, 6, 7, 8, 1, 5], np.int8)
型を指定しなかった場合は暗黙的に決まります。
型や形状を返す属性
dtype属性はNumPy配列の要素の型が確認できます。
dtype属性の例
data1 = np.array([9, 2, 3.9, 4, 10, 6.5, 7, 8.1, 1, 5.4]) data1.dtype
結果
dtype(‘float64’)
unicode型での注意
この内容は動画で説明していませんが、重要ですので押さえておくと良いです。
unicode型を使う時にデータ型を指定しないと、要素内の最大文字数で領域確保がされます。
従って、下の例のように最大文字数3の場合、その後に値を変更して文字数が増えても3文字以上の文字は消されることになります。
下の例ではabcdeと5文字を代入していますが、表示はabcの3文字になっています。
# unicode型を混ぜるとunicode型になる 表示結果のU3はUnicode 最大3文字の意味 data3 = np.array([['abc', 'b'], ['3', 'c'], ['f', 'z'],['x', 'm'],['r', 'u']]) print('dtype:', data3.dtype) print('shape:', data3.shape) data3[0,1] = 'abcde' data3[0]
結果
dtype: ‘<U3
shape: (5, 2)
array([‘abc’, ‘abc’], dtype=”<U3′)
int型とunicode型を混ぜるとunicode型になる例
data2 = np.array([1,'4',7,8,1,5]) data2.dtype
結果
dtype(‘<U21’)
表示結果のU21はUnicode 最大21文字の意味
この場合、int64型のスペースが確保されるようです。
shape属性について
shape属性はNumPy配列の形状(各次元のサイズ)
shape属の例
data3 = np.array([['abc', 'b'], ['3', 'c'], ['f', 'z'],['x', 'm'],['r', 'u']]) print('dtype:', data3.dtype) print('shape:', data3.shape)
結果
dtype: <U3
shape: (5, 2)
キャスト
astype(‘型’) を使うとキャストすることができます。
キャストの例
data1 = np.array([9, 2, 3.9, 4, 10, 6.5, 7, 8.1, 1, 5.4]) data4 = data1.astype('int8') print(data4) data4.dtype
結果
[ 9 2 3 4 10 6 7 8 1 5]
dtype(‘int8’)
参考になった書籍
機械学習入門時には、難しいし、リファレンスとしても使いにくいなどであまり活用しなかったが、特徴量エンジニアリングが必要になるくらいから途端にありがたい書籍になった。Pandasの作者自ら書いた本でNumpyやPandasの使い方が詳細に書かれている。
Pythonサンプルのダウンロード
ここでダウンロードする「numpy_lesson.ipynb」ファイルは、このPython動画で使用したものです。