Numpyのインデックスとスライスによるデータ取得は、基本的にはPython標準と同じルールです。インデックスは0始まりで、スライスは終点を含みません。
次のルールを覚えれば概ね対応できます。
【1】 array[数字]
arrayが1次元の場合は、指定したインデックスの要素を取得します。
arrayが2次元の場合は、指定したインデックスの「行」を1次元の配列で取得します。
【2】 2次元array[行, 列]
行と列はインデックス(数字)かスライス(:)で指定します。
行と列の両方をインデックスで指定した場合は、指定した位置の数値を返します。
行と列の片方がインデックスの場合は、arrayが2次元でも1次元の配列で返ります。
「array[:, [数字]]」の列の指定のように、インデックスを2次元で指定した場合は2次元で返ります。
スライスで全行もしくは全列を取得する場合は「:, :」とし、範囲を指定する場合は「:2, :」のようにします。