edo1z blog

プログラミングなどに関するブログです

Numpy - reshape

np.reshapeがややこしいので試してみる。

import numpy as np

a = np.array([1, 2, 3, 4, 5, 6])
print(a)
b = np.reshape(a, (2, 3))
print(b)

[1 2 3 4 5 6] [[1 2 3] [4 5 6]]

配列aを、2行3列に変換しろ!といっております。試しに(2, 4)とか、(2, 2)とかでやってみましたがエラーになりました。ちょうどいい数字になってないとエラーになるようです。

import numpy as np

a = np.array([1, 2, 3, 4, 5, 6])
print(a)
b = np.reshape(a, (2, 3))
print(b)
b[0][0] = 10
print(a)
print(b)

[1 2 3 4 5 6] [[1 2 3] [4 5 6]] [10 2 3 4 5 6] [[10 2 3] [ 4 5 6]]

bの要素を変えるとaも変わります。bはaの参照を持っているということでしょうか?なんか不思議です。

c = a.reshape(3, 2)
print(c)

上記のような書き方もできます。np.arrayには、reshapeというのがついてるようです。 cもbもaの参照を持っているようです。参照を持ちつつ形を変えております。numpyの配列は高機能です。

e = c.reshape(1, -1)
print(e)

上記のように-1を使うと、これは「おまかせ」ってことになります。 分からないからよきにはからえと伝えております。例えば、[1, 10, 4, 2, .....]といった感じの1次元配列があり、5個ずつ配列を分けたいというときは、(-1, 5)とやります。?行5列となりますので、5列ずつの配列をどんどんつくっていけということになります。ただ、ここで大本の配列の要素数が5で割り切れない場合は、エラーになるのか確かめてみます。

e = c.reshape(-1, 4)
print(e)

cはaの要素数6の1次元配列の参照を持っております。4列ずつに分けろと言われてもやはり無理だったようです。当然(-1, 3)であれば成功します。