1

numpy インデックス作成ルールを適切に理解しようとしているときに、次のことに出くわしました。以前は、インデックスの末尾の省略記号は何もしないと考えていました。些細なことですよね?ただし、実際にはそうではありません。

Python 3.5.2 (default, Nov 11 2016, 04:18:53) 
[GCC 4.8.5] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> 
>>> D2 = np.arange(4).reshape((2, 2))
>>>
>>> D2[[1, 0]].shape; D2[[1, 0], ...].shape
(2, 2)
(2, 2)
>>> D2[:, [1, 0]].shape; D2[:, [1, 0], ...].shape
(2, 2)
(2, 2)
>>> # so far so expected; now
... 
>>> D2[[[1, 0]]].shape; D2[[[1, 0]], ...].shape
(2, 2)
(1, 2, 2)
>>> # ouch!
...
>>> D2[:, [[1, 0]]].shape; D2[:, [[1, 0]], ...].shape
(2, 1, 2)
(2, 1, 2)

これがバグなのか機能なのか、詳しい人に教えてもらえませんか? また、後者の場合、その根拠は何ですか?

前もって感謝します、ポール

4

1 に答える 1

5

明らかに、[[1, 0]]インデックスの解釈にはあいまいさがあります。おそらくここで議論されているのと同じこと:

numpy でタプルの代わりにリストが渡されたときの高度なスライス

別の配列を試して、物事が明確になるかどうかを確認します

In [312]: D2=np.array([[0,0],[1,1],[2,2]])
In [313]: D2
Out[313]: 
array([[0, 0],
       [1, 1],
       [2, 2]])

In [316]: D2[[[1,0,0]]]
Out[316]: 
array([[1, 1],
       [0, 0],
       [0, 0]])
In [317]: _.shape
Out[317]: (3, 2)

:orを使用...してインデックス リストを配列にし、すべて (1,3) インデックスとして扱い、それに応じて結果の次元を拡張します。

In [318]: D2[[[1,0,0]],:]
Out[318]: 
array([[[1, 1],
        [0, 0],
        [0, 0]]])
In [319]: _.shape
Out[319]: (1, 3, 2)
In [320]: D2[np.array([[1,0,0]])]
Out[320]: 
array([[[1, 1],
        [0, 0],
        [0, 0]]])
In [321]: _.shape
Out[321]: (1, 3, 2)

インデックス配列に転置を適用すると、(3,1,2) の結果が得られることに注意してください。

In [323]: D2[np.array([[1,0,0]]).T,:]
...
In [324]: _.shape
Out[324]: (3, 1, 2)

:またはを使用しないと、1 番目の軸に適用する前に...の 1 つのレイヤーが剥がれているように見えます。[]

In [330]: D2[[1,0,0]].shape
Out[330]: (3, 2)
In [331]: D2[[[1,0,0]]].shape
Out[331]: (3, 2)
In [333]: D2[[[[1,0,0]]]].shape
Out[333]: (1, 3, 2)
In [334]: D2[[[[[1,0,0]]]]].shape
Out[334]: (1, 1, 3, 2)
In [335]: D2[np.array([[[[1,0,0]]]])].shape
Out[335]: (1, 1, 1, 3, 2)

ここには下位互換性の問題があると思います。タプル層が「冗長」であることはわかっています:D2[(1,2)]と同じD2[1,2]です。numpyただし、 ( )の初期バージョンとの互換性のために、numericその最初の[]レイヤーは同じ方法で処理される場合があります。

その 11 月の質問で、私は次のように指摘しました。

したがって、最上位レベルでは、リストとタプルは同じように扱われます (リストが高度なインデックス リストとして解釈できない場合)。

a の追加は、から...を分離する別の方法です。D2[[[0,1]]]D2[([0,1],)]

@eric/sプルリクエストseburgの説明から

 タプルの正規化はかなり小さいものです (基本的に、長さ <= np.MAXDIMS の非配列シーケンスをチェックし、別のシーケンスが含まれている場合、スライスまたは None はそれをタプルと見なします)。

[[1,2]]はリストを持つ 1 要素のリストなので、タプルと見なされ([1,2],)ます。 [[1,2]],...すでにタプルです。

于 2016-12-20T02:26:03.133 に答える