Python NumPy / ndarray のメソッド #4

株式会社リュディアです。今回も NumPy についてまとめていきます。

前回までの NumPy / ndarray のメソッドについてのまとめへのリンクは以下を参考にしてください。

以下のリンクの内容を元にまとめを作っていきます。

今回から Shape manipulation に分類されるメソッドのまとめに入っていきます。初回は reshape(), resize() です。どちらも行列の形状を変えるためのメソッドですがその違いを意識しながらまとめていきます。

まず reshape() から見ていきます。次の例を見てください。最初に 1から 12 まで 12個の要素をもつ 1行のベクトル x を用意してから reshape() を使います。

import numpy as np

x = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], np.int32)
print(x)

print(x.reshape(3, 4))
print(x.reshape(6, 2))

#
# [ 1  2  3  4  5  6  7  8  9 10 11 12]
#
# [[ 1  2  3  4]
#  [ 5  6  7  8]
#  [ 9 10 11 12]]
#
# [[ 1  2]
#  [ 3  4]
#  [ 5  6]
#  [ 7  8]
#  [ 9 10]
#  [11 12]]
#

x.reshape(3, 4) で 1行ベクトルを 3行4列の行列に変形しています。できてますね。同様に x.reshape(6, 2) で 1行ベクトルを 6行2列の行列に変形しています。簡単ですね。

では次の例を見てください。12個の要素をもつ 1行のベクトル x を 2行4列の行列に変形しようとしましたがエラーになりました。2行4列では元の 12個の要素に対して数が少ないですね。reshape() を使う場合には要素数が合致してないとエラーになります。

import numpy as np

x = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], np.int32)
print(x)

print(x.reshape(2, 4))

#
# [ 1  2  3  4  5  6  7  8  9 10 11 12]
# Traceback (most recent call last):
#  File "c:\Users\file.py", line 6, in <module>
#    print(x.reshape(2, 4))
# ValueError: cannot reshape array of size 12 into shape (2,4)
#

次も同様に要素数が合致しない例ですが今度は多くなる場合、この例では 4行4列 で要素数が 16 になるように変形しようとしていますが結果はエラーですね。

import numpy as np

x = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], np.int32)
print(x)

print(x.reshape(4, 4))

#
# [ 1  2  3  4  5  6  7  8  9 10 11 12]
# Traceback (most recent call last):
#  File "c:\Users\file.py", line 6, in <module>
#    print(x.reshape(4, 4))
# ValueError: cannot reshape array of size 12 into shape (4,4)
#

再度書きますが reshape() を使う場合には要素数が一致していることが重要です。

次は resize() について見てみます。結論から言うと resize() は要素数が合致しない場合も対応可能です。再度、英語を意識してみると reshape() はあくまで再形状化(要素数の変化なし)であり resize() はサイズを変更するという意味ですね。では resize() の例をまとめてみてみます。

import numpy as np

x = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], np.int32)
print(x)

x.resize(3, 4)
print(x)
x.resize(2, 4)
print(x)
x.resize(5, 5)
print(x)

#
# [ 1  2  3  4  5  6  7  8  9 10 11 12]
#
# [[ 1  2  3  4]
#  [ 5  6  7  8]
#  [ 9 10 11 12]]
#
# [[1 2 3 4]
#  [5 6 7 8]]
#
# [[1 2 3 4 5]
#  [6 7 8 0 0]
#  [0 0 0 0 0]
#  [0 0 0 0 0]
#  [0 0 0 0 0]]
#

まず resize(3, 4) は 3行4列の行列に変形するだけなので reshape() でも同じ結果です。要素数を保持する場合には reshape() でも resize() でも結果は同じになります。

次の resize(2, 4) の結果はどうでしょうか。元の12個の要素をもつ 1行のベクトル x を 2行4列の行列に resize すると要素数が 8になります。そのため元のベクトルの先頭から8個だけを使った新しいベクトルが作られます。余った部分は切り捨てられるということです。

最後の resize(5, 5) はどうでしょうか。12個の要素をもつ 1行のベクトル x に対して 5 x 5 = 25要素の行列に resize したいわけです。要素数が不足しているところは 0 で埋められていることがわかりますね。

今回は reshape() と resize() についてまとめてみました。違いについても理解いただけだと思います。

NumPy / ndarray のメソッドに関するまとめの続きは以下からどうぞ。

では、ごきげんよう。



この記事が気に入ったらサポートをしてみませんか?