2016-01-25 19 views
12

非常に多くの場合、配列はnp.squeeze()で圧縮されます。ドキュメントでは、なぜnp.squeeze()が必要ですか?

の形から1次元エントリを削除します。しかし

私はまだ思ったんだけど:なぜの形状でゼロと無次元のエントリがありますか?または、別の言い方をすると、なぜ両方ともa.shape = (2,1)(2,)が存在するのですか?

答えて

11

2つのものの数学的な違いに加えて、予測可能性の問題があります。あなたの提案が守られれば、あなたのアレイの次元に依存することはできません。したがって、my_array[x,y]という形式の式は、最初にmy_arrayが2次元であるかどうかをチェックし、ある時点で暗黙的にsqueezeを持っていないもので置き換える必要があります。これはおそらく明確に指定されたことを行う時折squeezeよりもはるかにコードを難読化するでしょう。

実際には、どの軸が削除されているかを知ることは非常に難しく、新しい問題が発生する可能性があります。

The Zen of Pythonの趣旨では、Explicit is better than implicitでも暗黙的な配列変換を明示的にsqueezeと言います。

3

重要度の1つの例は、アレイを乗算する場合です。 2つの2次元配列は、一度に各値を掛ける。

>>> x = np.ones((2, 1))*2 
>>> y = np.ones((2, 1))*3 
>>> x.shape 
(2,1) 
>>> x*y 
array([[ 6.], 
     [ 6.]]) 

あなたは2D配列によって1次元配列を掛けた場合、動作は第二に、あなたはまた、例えば、以前の寸法を圧迫することがあります

>>> z = np.ones((2,))*3 
>>> x*z 
array([[ 6., 6.], 
     [ 6., 6.]]) 

異なっていますa.shape =(1,2,2)からa.shape =(2,2)

+0

従来のスタイルに固定 – benj

関連する問題