データ分析実践
中級問題チェック

問題 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のスライスは参照を返します。これは大量のデータを扱う際に、メモリを効率よく使うためです。