libro
www.tuyano.com
初心者のためのJupyter入門

ベクトル・行列の演算 (4/4)

作成:2018-02-03 12:09
更新:2018-02-03 12:09

■スライスについて

前回の説明で、ベクトルを逆順にするのに、[::-1] というものを使いました。a[::-1]とすれば、ベクトルaの逆順が得られましたね。

この[::-1]というのは、「スライス」と呼ばれる機能です。スライスは、ベクトルや行列の中から一部分だけを抜き出すのに用いられます。使い方をまとめましょう。


●ベクトルのスライス
変数 = ベクトル [ 開始位置 : 終了位置 : ステップ ]
ベクトルの開始インデックスから終了インデックスまでの間から、指定のステップごとに値を取り出して新しいベクトルを作成できます。例えば、こんな具合です。
numpy.array([1,2,3,4,5,6,7,8,9])[1:7:2]
 ↓
[2 4 6]
これを利用すれば、ベクトルの逆順も簡単に得られます。これはベクトルの[::-1]の値を取得すればいいのです。例えば、a[::-1] とすれば、ベクトルaの逆順のベクトルが得られます。


●行列のスライス
変数 = 行列 [ 開始1 : 終了1 : ステップ1, 開始2 : 終了2: ステップ2 ]
行列の場合、行方向と列方向でそれぞれ開始位置、終了位置、ステップ数を指定できます。例えば、こんな具合に使います。
numpy.matrix([[1,2,3],[4,5,6],[7,8,9]])[1:3:, 1:3:]
 ↓
[[5 6]
[8 9]]
これを更に逆順にしたい場合は、[1:3:-1, 1:3:-1]としてもうまくいきません。[1:3:, 1:3:]で得られたものを更に[::-1, ::-1]で逆順にします。こうですね。
numpy.matrix([[1,2,3],[4,5,6],[7,8,9]])[1:3:, 1:3:][::-1, ::-1]
 ↓
[[9 8]
[6 5]]


■スライスは「ビュー」を取得する

スライスを利用する時、注意しなければいけないのは、「スライスは、新たなベクトルや行列を生成するわけではない」という点です。例えば、以下のように実行してみるとそれがわかります。
a = numpy.array([1, 2, 3])
b = a[::-1]
print(b)
a[1] = 0
print(b)
 ↓
[3 2 1]
[3 0 1]
ベクトルaを逆順にしたものを変数bに取得します。それを表示した後、ベクトルaの値を書き換えてから変数bを表示すると、bの内容も書き換わっていることがわかります。

なぜ、こんなことになるのか?というと、スライスした値を収める変数bは、ベクトルaの値を逆順に「見せている」だけのものだからです。

この変数bは「ビュー」と呼ばれます。ビューは、ベクトルや行列を本来とは別の形に見せるためのものです。実際に使われている値そのものは、元のベクトル/行列から参照しています。このため、元のベクトル・行列の値を書き換えると、ビューの表示も変わってしまうのです。

スライスは非常に便利な機能ですが、このように「元の値を参照しているだけ」という点に注意する必要があります。もし、もとの値とは別の、独立したベクトル・行列として取得したい」という場合は、copyメソッドを使います。
a = numpy.array([1, 2, 3])
b = a[::-1].copy()
print(b)
a[1] = 0
print(b)
 ↓
[3 2 1]
[3 2 1]
このように、a[::-1].copy()とすると、スライスして作ったビューをコピーして(もとの値を参照しない)独立したベクトルとして変数bに代入します。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

※関連コンテンツ

「初心者のためのJupyter入門」に戻る