:と、の違い、numpy

Oct 04 2020

いくつかのリソースはnumpy、の配列スライシングでは、array[2,:,1]結果はと同じになるarray[2][:][1]と述べていますが、この場合、同じものは得られません。

array3d = np.array([[[1, 2], [3, 4]],[[5, 6], [7, 8]], [[9, 10], [11, 12]]])
array3d[2,:,1]
out: array([10, 12])

そして:

array3d[2][:][1]
out: array([11, 12])

違いはなんですか?

回答

3 hpaulj Oct 04 2020 at 15:54

一部のリソースが間違っています!

In [1]: array3d = np.array([[[1, 2], [3, 4]],[[5, 6], [7, 8]], [[9, 10], [11, 12
   ...: ]]])
In [2]: array3d
Out[2]: 
array([[[ 1,  2],
        [ 3,  4]],

       [[ 5,  6],
        [ 7,  8]],

       [[ 9, 10],
        [11, 12]]])

インデックスがすべてスカラーの場合、この種の分解は機能します。

In [3]: array3d[2,0,1]
Out[3]: 10
In [4]: array3d[2][0][1]
Out[4]: 10

1つのインデックスが次元を縮小し、1つの「平面」を選択します。

In [5]: array3d[2]
Out[5]: 
array([[ 9, 10],
       [11, 12]])

[:]その上では何もしません-それ自体はプレースホルダーではありません。多次元インデックス内では、それはスライスであり、その次元のすべてです。リストでも同じ動作が見られます。alist[2]要素をalist[:]返し、リスト全体のコピーを返します。

In [6]: array3d[2][:]
Out[6]: 
array([[ 9, 10],
       [11, 12]])

覚えておいてください、numpyはpythonパッケージです。Python構文は、すべてのレベルで引き続き適用されます。x[a][b][c]3つのインデックス作成操作を順番に実行し、それらを「チェーン」します。x[a,b,c]は1つのインデックス作成操作であり、のタプルをに渡しxます。そのタプルを解釈するのは、やっかいなコードです。

残りのディメンションには多次元インデックスを使用する必要があります。

In [7]: array3d[2][:,1]
Out[7]: array([10, 12])
In [8]: array3d[2,:,1]
Out[8]: array([10, 12])

通訳は実際に次のことを行います。

In [9]: array3d.__getitem__((2,slice(None),1))
Out[9]: array([10, 12])

In [11]: array3d.__getitem__(2).__getitem__((slice(None),1))
Out[11]: array([10, 12])