ソフトな忘却力(82) みんな大好きNumPy配列のデータ型のお勉強

Joseph Halfmoon

「サイエンティフィックPythonのための」IDE、Spyder上にてScientific Python Lectures様のレクチャ実習中。今回はNumPyの実習6回目です。Numpy配列に詰めこむ要素の型についての練習です。基本「同じもの」を詰め込むのだけれども、いろいろできてしまうので忘却力の老人は覚えきれるか?

※「 ソフトな忘却力」投稿順 Index はこちら

※レクチャ実習中といっても、「準拠」しているのはレクチャの章立てくらいです。Scientific Python Lectures様のコースは例題だけでなく、エクササイズなども充実、それを全部順番に解いていったら必ずや立派な人になれるだろ~とは思います。でもキチンとやったら、死ぬまでに終わらない、と手抜き正当化。

整数配列にスカラーの浮動小数を足してみる

Pythonは結構、融通利かせてくれる処理系じゃないかと思います。NumPy配列についても例外じゃないようです。以下のように整数型の配列作っておいて、その全ての要素に浮動小数のスカラー値を足し込む、なんて操作を許してくれます。

import numpy as np
s0 = np.arange(5)
s1 = s0 + 0.77

このときのs0とs1の型を観察すると以下のようです。iapsf

何も言わないと、整数は int64型になるようですが、スカラーの浮動小数(これまた何も言わないとfloat64、倍精度型)を全要素に足し込むと結果はfloat64だと。大は小を兼ねるスタイル?

整数配列の一部に浮動小数を代入

上記は配列全体にスカラーを足し込んだので、全要素に対する操作でした。しかし個別要素への代入も可能っす。こんな感じ。

s0[0] = 9.99

この場合は int64 配列の一部への代入なので、浮動小数の小数点以下は切り捨てられて整数化されてしまうみたい。i64

型変換、丸め

なお、配列の型の変換を行うメソッドやら、丸めを行うメソッドなどもあり。こんな感じ。

s2 = s1.astype(np.int16)
s3 = np.around(s1)

結果が以下に。around

型の最大値、eps

また以下は配列の操作ではないですが、配列要素の「型」のスペック的なものを取り出すことも可能。max_eps

「構造体」の配列

なんとNumPyは、C言語でいう「構造体」の配列も作ることが可能でした。構造体のメンバには文字列でフィールド名つけられます。こんな感じ。

structA = np.zeros((3), dtype=[('idx', int),('v1', float)])

その時のSpyderの変数エクスプローラーの表示が以下に。structA

流石に構造体の中身までは表示してくれないみたい。

構造体配列の各要素の各メンバに代入は勿論可能。structA_assign

さらに特定のメンバについて列挙することも可能。structA_idx

また、構造体配列に対する Fancy indexing も可能なので、条件を満たす要素の取り出しなども自在。便利だな。structA_fancy

NaNとマスクド配列

勿論、NumPyは、NaN(Not A Number)を扱うことが可能っす。ただし、NumPyのNaNは「静か」ではない方だけのようです。一方、MaskedArrayというものもあり、こちらを使うと、欠損値みたいなものを「その座席を確保」したまま、とりあえず無視して計算をすすめることができるみたい。こんな感じ。maskedArray

型についても自由自在だと。ホントか?

ソフトな忘却力(81) みんな大好きNumPy配列のソートのお勉強 へ戻る

ソフトな忘却力(83) みんな大好きNumPy配列へのデータ読み込みのお勉強 へ進む

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です