2016-08-22 5 views
4

私はPythonのデータ解析には新しく、多次元配列を別の次元に操作する方法を見つけようとしています。チュートリアルやフォーラムでオンラインで「newshape」のパラメータを指定する方法が説明されていないnumpy.reshape(a, newshape, order='C')numpyのreshape()のnewshapeパラメータを指定する方法を理解する

ここでは理解しようとしている例を示します。誰かがnewshape引数はタプル(または互換性のもの)として渡されなければならライン4

import numpy as np 
a1 = np.arrange(8).reshape((8,1)) 
b = np.repeat(a1,8,axis=1) 
c = b.reshape(2,4,2,4)    # line 4 

答えて

3

週間前から同様の質問:How to understand ndarray.reshape function?

np.reshape(a, newshape)a.reshape(newshape)として作り直します。しかし、a.reshapeは組み込みのコンパイルされたメソッドです。だから、どのように処理するの詳細はnewshape(Pythonプログラマーに)隠されています。

これらの例は、newshapeがタプルまたは別個の数字であることを示しています。しかし、ある意味では、別々の数字の場合でもタプルを使用します。関数への引数はタプルとして渡されます。

これは、おそらくインデックス作成で最も明白です。 a[:,1,3]は通訳者によってa.__getitem__((slice(None),1,3))コールに翻訳されます。そして、実際にはは、ind = (slice(None),1,3); a[ind]のように許可されています。

In [58]: def foo(*args): 
    ...:  if len(args)==1: 
    ...:   args = args[0] 
    ...:  print(args) 
    ...:  

In [59]: foo(1,2,3) 
(1, 2, 3) 

In [60]: foo((1,2,3)) 
(1, 2, 3) 

私はもう少し同じこれら2例の治療のためにそれを洗練する必要があります:

In [61]: foo(1) 
1  
In [62]: foo((1,)) 
(1,) 

これはオプション()の余分な層を作る独自の関数を書くのは簡単です関数をdef foo(arg):と定義した場合、いくつかの数値を与えたい場合はタプルを使用する必要があります。

これは、経験豊富なPythonプログラマーがこれらの違いに悩まされていない理由を説明してくれることを願っています。多くの場合、タプルは値をグループ化する便利な方法です。明快さを加えることができますが、必ずしも必要ではありません。コーダーはどちらかの方向に進むことができます - 存在を光沢にするかどうか、それとも大きなものになりますか?

===================

変形方法は(githubののnumpyのリポジトリに)numpy/core/src/multiarray/methods.cに定義されています。

shape=(2,3) 
np.arange(6).reshape(shape) 
np.arange(6).reshape(*shape) 
np.arange(6).reshape(2,3) 
np.arange(6).reshape((2,3)) 
np.arange(6).reshape((2,)+(3,)) 
cで書かれてますが、ので、これらはすべて同じであることが解析されていますいずれにせよ

def reshape(self, *args, **kwargs): 
    n = len(args) 
    if n<=1: 
     newshape = <parse args[0] in one way> 
    else: 
     newshape = <parse args in another way> 
    return PyArray_Newshape(self, newshape, order) 

と同等であるように思われます

1

を説明することができればそれはnumpy.reshapeに非常に役立つだろう。しかしここにキャッチがあります:numpy.ndarray.reshapeに渡されたキーワード以外のすべての引数(例:b.reshape)は、引数newshapeによってキャッチされます。これは、次は同等と有効であることを意味します

# b = np.random.rand(2*4*2*4) 
np.reshape(b,(2,4,2,4)) 
np.ndarray.reshape(b,(2,4,2,4)) 
np.ndarray.reshape(b,2,4,2,4) 
b.reshape((2,4,2,4)) 
b.reshape(2,4,2,4) 

これはエラーをスローしながら:

np.reshape(b,2,4,2,4) 

重要な違いがnp.reshapenp.ndarray.reshapeが異なる動物であるということである、とb.reshapeはのバウンドバージョンです後者。


またhelp(np.reshape)を比較する必要があります。

help(b.reshape)
reshape(a, newshape, order='C') 
    Gives a new shape to an array without changing its data. 

a.reshape(shape, order='C') 

Returns an array containing the same data with a new shape. 

あなたが見ることができるように、np.reshapeは、特定の配列についての情報を持っていないので、あなたがしたい場合それを使用して何かを再形成するには、を明示的にに渡す必要があります。一方、b.reshapeは変数bにバインドされているため、新しい形状と、オプションでorderキーワード引数を与えられます。

0

これは配列のshapeを理解するための別の視点であり、それがあなたが求めているものの一部である場合です。 shapeパラメータ(2, 4, 2, 4)は、配列の4つの異なる軸に沿った長さを指定します。あなたが概念的にそれをリストのリストとみなすならば、それは最も外側のリストから最も内側のリストまでの長さを意味します。たとえば、配列Cの場合は、次の項目をチェックします。

len(c) 
# 2 

len(c[0])   # same result if you check c[1] 
# 4 

len(c[0][0]) 
# 2 

len(c[0][0][0]) 
# 4 

これは形状パラメータと一致します。行列である2次元配列であり、又はより良好な例である:あなたが見ることができるように

a = np.array(range(9)) 
a 
# array([0, 1, 2, 3, 4, 5, 6, 7, 8]) 

b = a.reshape(3,3) 
b 
# array([[0, 1, 2], 
#  [3, 4, 5], 
#  [6, 7, 8]]) 

baと同じデータを持っているが、2次元構造を有し、形状で指定された各3の長さを有しますパラメータ。そして、今あなたがチェックした場合:

len(b) 
# 3 

len(b[0]) 
# 3 

これは形状パラメータを戻します。

関連する問題