web-dev-qa-db-ja.com

Numpy / Scipyで配列をスライスする

私は次のような配列を持っています:

a = array([[1,2,3],[3,4,5],[4,5,6]])

「a」の最初の2列しかないこれから1x2配列をスライスする最も効率的な方法は何ですか?

つまり.

array([[2,3],[4,5],[5,6]]) in this case.
16
user248237

2次元のnumpy配列は、(a[i,j]ではなく)a[i][j]を使用してインデックス付けされますが、python)の通常の行列と同じスライス表記をnumpy配列と行列で使用できます。 =(それらを単一の[]に入れるだけです):

 >>> from numpy import array 
 >>> a = array([[1,2,3]、[3,4,5]、[4,5,6]]) 
 >>> a [:、1:] 
 array([[2、3]、
 [4、5]、
 [5、6] ])
25

これはあなたが探しているものですか?

a[:,1:]
6
Wolph

documentation を引用すると、基本的なスライス構文はi:j:kです。ここで、iは開始インデックス、jは終了インデックス、kはステップです(k > 0の場合)。

これで、iが指定されていない場合、k > 0の場合はデフォルトで0になります。それ以外の場合、in - 1に対してデフォルトでk < 0になります(ここで、nは配列の長さです)。

jが指定されていない場合、デフォルトでn(配列の長さ)になります。

これは1次元配列用です。

これで、2次元配列は別の獣になりました。そのためのスライス構文はa[rowrange, columnrange]です。

したがって、すべての行が必要で、最後の2列だけが必要な場合は、次のようにします。

a[0:3, 1:3]

ここで、「[0:3]」は0から3までのすべての行を意味し、「[1:3]」は列1から列3までのすべての列を意味します。

不思議に思うかもしれませんが、列が3つしかなく、番号付けは1から始まりますが、3列を返す必要がありますか?つまり、列1、列2、列3

これは、この構文のトリッキーな部分です。最初の列は実際には列0です。したがって、「[1:3]」と言うときは、実際には列1と列2を教えてくださいと言っています。どちらが最後の2列です。 (実際には列3はありません。)

これで、行列の長さがわからない場合、またはすべての行が必要な場合は、その部分を空のままにしておくことができます。つまり.

a[:, 1:3]

同じことが列にも当てはまります。つまり、最初の行だけを除くすべての列を言いたい場合は、次のように記述します。

a[0:1,:]

さて、上記の答えa[:,1:]がどのように機能するかは、列に「[1:]」と言うと、列0を除くすべてを、すべての列の終わりまで与えることを意味するためです。つまり、空は「最後まで」を意味します。

ここまでで、コンマの両側にあるものはすべて、前述した1次元の場合のサブセットであることを理解する必要があります。つまり、ステップサイズを使用して行を指定する場合は、次のように記述できます。

a[::2,1]

あなたの場合、どちらが返されますか

array([[2, 3],
       [5, 6]])

つまり、a[::2,1]は次のように説明します。一番上から始めて1行おきに、2番目の列だけを表示します。

これは私が理解するのに少し時間がかかりました。誰かに役立つ場合に備えて、ここに貼り付けます。

3
mithunpaul