週間前から同様の質問: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)
と同等であるように思われます