データ分析実践
中級問題チェック
問題 16 /40
NumPyのスライスの結果として、誤っているものはどれか。
arr = np.array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
選択 1
arr[::2]
▶︎
array([[0, 1, 2],
[3, 4, 5]])
選択 2
arr[::-1]
▶︎
array([[6, 7, 8],
[3, 4, 5],
[0, 1, 2]])
選択 3
arr[:2, ::2]
▶︎
array([[0, 2],
[3, 5]])
選択 4
arr[::-1, ::-1]
▶︎
array([[8, 7, 6],
[5, 4, 3],
[2, 1, 0]])
解説
選択肢1が正解です。
NumPyのndarrayは、Pythonのリストと同様にスライス(:)で部分選択ができます。
スライスは [start:stop:step] をインデックス番号で指定します。startは0で始まり、stopは一つ前までを取得します。
以下は一次元配列の例です。
arr = np.array([0, 1, 2, 3, 4, 5])
arr.shape
▶︎
(6,)
arr[2:5]
▶︎
array([2, 3, 4])
インデックス番号2からstartするため「2」から始まり、インデックス番号5でstopします。stopのインデックスは含まないため、最後は「5」ではなく「4」です。stepは省略されており、省略しない場合は「arr[2:5:1]」になります。
arr[-5:-2]
▶︎
array([1, 2, 3])
マイナスは逆順になります。マイナスのインデックスは-0がないため、インデックス番号-1が「5」、インデックス番号-2が「4」になります。[-5:-2]の場合、インデックス番号-5の「1」から始まり、インデックス番号-2の「4」で終わります。終点は含まないため、最後は「3」になります。stepは省略されています。
arr[::-1]
▶︎
array([5, 4, 3, 2, 1, 0])
starが:、stopが:のため、すべてを取得したことになります。stepを-1にすると逆順に取得するため、すべてを逆順にしたことになります。
start、stop、stepは省略可能で、ルールは以下になります。
■ startを省略する場合は:stop:step
■ stopを省略する場合はstart::step
■ stepを省略する場合はstart:stop
問題文のarrは2次元配列です。
arr = np.array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
arr.shape
▶︎
(3, 3)
2次元の場合は、[start:stop:step, start:stop:step] のようにカンマで区切って指定します。最初の「start:stop:step」が行で、カンマの後の「start:stop:step」が列を指定しています。
【選択肢1】
arr[::2]
▶︎
array([[0, 1, 2],
[3, 4, 5]])
誤った結果です。
これは「arr[:2]」の結果です。
arr[:2]
▶︎
array([[0, 1, 2],
[3, 4, 5]])
[:2]はカンマで区切られていないため、行だけ指定しています。startは:、stopは2、stepは省略されています。stopがインデックス番号2で、stopは含まないため、2行目まで取得してます。
選択肢1の[::2]もカンマで区切られていないため、行だけ指定しています。startは:ですべて、stopも:ですべて、stepが2で一つ飛ばしになるため、正しい結果は以下です。
array([[0, 1, 2],
[6, 7, 8]])
【選択肢2】
arr[::-1]
▶︎
array([[6, 7, 8],
[3, 4, 5],
[0, 1, 2]])
正しい結果です。
stepを「-1」とすると配列を逆順に取得します。[::-1]の場合はカンマがないため、行の順番だけ逆になります。
カンマで区切って行と列を逆順にすると選択肢4の結果になります。
【選択肢3】
arr[:2, ::2]
▶︎
array([[0, 2],
[3, 5]])
正しい結果です。
行の「:2」はstartが:、stopが2、stepが省略のため、2行目まで取得しています(インデックス番号2は含まない)。
列の「::2」はstartが:、stopが:、stepが2のため、一つ飛ばしで取得しています。
カンマの前が「2:」だった場合、sartが2、stopが:、stepが省略のため、3行目から取得して以下の結果になります。
arr[2:, ::2]
▶︎
array([[6, 8]])
【選択肢4】
arr[::-1, ::-1]
▶︎
array([[8, 7, 6],
[5, 4, 3],
[2, 1, 0]])
正しい結果です。
行も列も逆順で取得しています。
なお、Pythonのリストのスライスはコピーを返しますが、NumPyのndarrayのスライスは参照を返します。これは大量のデータを扱う際に、メモリを効率よく使うためです。