皆さん、こんにちは。
南波真之(なんばさねゆき)と申します。
私はエンジニアではない文系の人間ですが、Pythonの可能性やデータ分析を使った仕事に興味があります。
前回はPythonの標準機能に追加しての数値計算や多次元配列を利用できるNumPyを使ったPythonの値コピーの考え方について紹介してきました。
参照とコピーという2つがあり、それぞれの特徴がありますので興味のある方はぜひ御覧ください。
今回も、NumPy(ナムパイ)ですが、その中でも次元追加について取り上げます。
次元というと多次元配列という言葉が思い浮かびますが、データの表現の仕方としてとても都合がいいものです。実はNumPyを使うととても簡単に実現できます。
NumPyによる配列、ndarrayについて
NumPyを使うと、Pythonが標準でもっているデータ構造のリスト型に比べて多次元配列のデータを扱えるようになります。
配列用のデータ型はndarrayといいます。
配列(array)は一般的に、情報を記憶しておくための箱としての変数の一つで、複数の箱が連なっているものを示します。
1次元配列
例えば、シンプルな1次元配列の場合はこのようになります。
# NumPyをインポート import numpy as np # array関数にPythonのリストを渡す→ndarrayオブジェクトが作られるので、ここに3つの要素を入れる a = np.array([1, 4, 8]) # aの出力を確認 a |
出力:変数aに配列のデータが格納された
array([1, 4, 8]) |
次に、変数aのデータタイプを確認
# タイプを確認 type(a) |
出力:ndarrayが出力された
numpy.ndarray |
.shapeを使って、データの形を確認する
# .shapeでnumpy.ndarrayの形状をタプルとして取得できる a.shape |
出力:要素が3つの1次元配列
(3, ) |
2次元配列
次に2次元配列を見てみます。
# 2次元配列を作るためにPythonのリストをネストさせた2重リストを使い、2次元のndarrayオブジェクトを作る b = np.array([[2, 4, 6], [3, 6, 9]]) # 2次元配列を代入した変数bの出力を確認 b |
出力:変数bに2次元配列のデータが格納された
array([[2, 4, 6], [3, 6, 9]]) |
2次元配列が格納されている変数bのデータタイプを確認
# タイプを確認 type(b) |
出力:ndarrayが出力された
numpy.ndarray |
.shapeを使って、データの形を確認する
# .shapeでnumpy.ndarrayの形状をタプルとして取得できる b.shape |
出力:2×3の行列であることがわかる(2行3列のデータ)
(2, 3) |
次元追加について
ここまでで1次元、2次元についてわかりましたので、この次元を追加する場合について考えてみます。
例えば、2次元→3次元というような場合です。
色々調べてみると、実は次元追加にはいくつか方法があることがわかりました。その使い分けについて疑問に思いましたので書いていこうと思います。
次元追加の方法としては3つありました。
- np.newaxis
- reshape
- np.expand_dims
1.np.newaxis
まずは、np.newaxisです。NumPyを使うことで定義されているnewaxisという変数を使って次元を追加するという方法で、使い方としては、次元を追加したい場所にnp.newaxisを入れてあげて、スライスの書き方を使う形となります。
例:先程の変数bを使って次元追加
# 変数b(2次元配列)をnp.newaxisを使って3次元配列にする c = b[np.newaxis, :, :] c |
出力:cを出力したときに[]が1つ増えているのがわかる
array([[[2, 4, 6], [3, 6, 9]]]) |
次に、.shapeを使って、データの形を確認
c.shape |
出力: np.newaxisを入れたところに次元ができている
(1, 2, 3) |
これで次元追加がされたことになります。
np.newaxisは次元を追加したい場所に入れられるため、例えばこのような使い方もできます。
新しく用意した変数dに対して次元追加
d = b[:, np.newaxis, :] d |
出力:cを出力したときに[]が1つ増えているのがわかる
array([[[2, 4, 6]], [[3, 6, 9]]]) |
.shapeを使って、データの形を確認
d.shape |
出力:np.newaxisを入れたところに次元ができている
(2, 1, 3) |
このように次元追加の場合にとても簡単に使うことができるのがnewaxisです。意味もそのままnew(新しい)axis(軸)で分かりやすいですね。
このnp.newaxisはもう1つの書き方があり、それがNoneになります。
Noneのほうも使われているようですが最初のうちはnp.newaxisを使うほうが分かりやすいと思います。
例:np.newaxisの代わりにNoneで次元追加を確認
e = b[None, :, :] e |
出力:次元追加されている事がわかる
array([[[2, 4, 6], [3, 6, 9]]]) |
.shapeを使って、データの形を確認
e.shape |
出力:Noneを入れたところに次元ができている
(1, 2, 3) |
2.reshape
次の書き方は、NumPyのreshapeというメソッドを使う方法です。
特徴としては、要素数を指定する必要があるところです。
例:新しい1次元配列を用意
f = np.array([1, 2, 4, 6, 8, 10, 14, 19, 29]) f |
出力
array([1, 2, 4, 6, 8, 10, 14, 19, 29]) |
.shapeを使って、データの形を確認
f.shape |
出力:要素が9つの1次元配列
(9,) |
この変数fに対して、3行3列に次元追加
# reshapeの後に要素数を指定する g = f.reshape((3, 3)) g |
出力:次元が追加されている事がわかる
array([[ 1, 2, 4], [ 6, 8, 10], [14, 19, 29]]) |
.shapeを使って、データの形を確認
g.shape |
出力: 次元が指定した通りにできている
(3, 3) |
※ちなみに、
g = np.reshape(f, (3, 3))
のような書き方もできますが、明らかにf.reshape((3, 3))としたほうが分かりやすいですね。
先程のnp.newaxisとの違いは書き方の違いだけのようです。
3.np.expand_dims()
この書き方が載っているWebの記事なども見かけます。
NumPyのドキュメントを確認すると、バージョン1.13.0以降、非推奨となっていました。
執筆時点ではNumPy 1.21までリリースされているため、np.expand_dims()を見かけたら、np.newaxisか、reshapeを使うのが良さそうです。
PythonではNumPyをうまく使おう
いかがでしたでしょうか。
今回は、NumPyの次元追加について書いてきました。
Pythonでデータ分析をする上では、NumPyは必須項目です。理解すべき項目も多いですが、細かい部分を理解しておくことで応用が効くようになると思いますので、頑張りましょう。
インターネットアカデミーは、Python講座が充実しています。Python認定スクールにもなっているため質の高い知識を得ることができ、基礎学習の先にあるそれぞれの目標を目指していくためには良い場所となります。
よく、「プログラミングは独学でもなんとかなる」という情報もありますが、新しいことを学んでいく際の近道は「プロに教えてもらうこと」だと思います。
インターネットアカデミーはキャリアサポートも充実しており、一人ひとりに専任のキャリアプロデューサーがサポートしてくれるため中途半端になることがありません。
ご興味ある方は各講座のページを覗いてみてください。無料カウンセリングもできます。
- Pythonの基礎からDjangoフレームワークを使ったWebアプリケーションを作りたい方向けの「Python講座」
- Pythonを活用したAIプログラミング、機械学習を実装したい方向けの「AIプログラミング講座」