2012-03-16 4 views
4

私は多くの関数、特にnumpyで関数のパラメータとしてタプルを利用するのはなぜだろうか?なぜ関数のパラメータでタプルの規則?

例えば:おそらくそのために使用することができるもの

a = numpy.ones((10, 5)) 

?明らかに最初のパラメータは常に配列のサイズを示すので、単に以下のようなものを持たないのはなぜですか?

a = numpy.ones(10, 5) 

dtypeなどの追加パラメータがある可能性がありますか?たとえそうであっても、

は、複雑なタプルの規則を使用するよりもはるかにクリーンなようです。

ご回答

+3

タプルは、それらの数値が効果的に単一の値として渡される場合や、発信者がそのように扱うことを合理的に期待できる場合に意味があります。 –

+1

NumPyは完全に一貫していないことに注意してください:['ndarray.reshape'](http://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.shape。html)は、可変数の引数*または*タプルのいずれかをとります。 –

+1

@larsmans - 本当ですが、それが価値あるものであれば、それは比較的最近の変更(〜 '1.3'、多分?)だったと確信しています。私は明示的に 'x.reshape(nrows、ncols)'の代わりに 'x.reshape((nrows、ncols))'を明示的に行うことを覚えています。 –

答えて

3

をありがとうあなたが行うことができるようにしたいので:

a = numpy.ones(other_array.shape) 

other_array.shapeはタプルです。これと一貫性がなく、あなたが記述したように機能するいくつかの関数があります。 numpy.random.rand()

+0

ダーンはそれに私を打つ。 – mklauber

+2

'np.ones'が可変個の引数を取った場合、' np.ones(* other.shape) 'はうまくいきましたので、これはすべての話ではありません。 –

+0

@mklauber:申し訳ありませんが、numpy機能の仕組みがわからないため、私はこの問題を混乱させていました。もともと私は、 'os.path.join'の働き方が私を悩ませると言っていました。なぜなら、すでに参加するパス名のリストを持っていれば' os.path.join(* args) 'と言う必要があるからです。 関数のパラメータとして、リストまたは配列を可変数のパラメータよりも使用する方が適切です。なぜなら、同じ種類の項目のリストを操作するように関数に依頼しているからです。これは 'str.join'と一貫しています。 – zigg

2

これは、さまざまな方法の間で一貫性をもたらすことができると考えています。私はnumpyに慣れていませんが、numpyが配列のサイズを返すことができれば、そのサイズは1つの変数として別のnumpyメソッドに直接渡すことができます。そのサイズのアイテムがどのように構築されているかについて内部的なことについて知る必要はありません。

他の部分は、配列のサイズが2つのコンポーネントを持つことがありますが、2つではなく1つの値として説明されています。

2

私の推測:np.onesのような関数では、shapeは単一の値のときにキーワード引数として渡すことができるからです。

np.ones(dtype=int, shape=(2, 3)) 

を試してみて、あなたがnp.ones((2, 3), dtype=int)から得ているだろうとあなたは同じ値を取得することに注意してください。

[このより一般的にPythonで動作します。

>>> def f(a, b): 
...  return a + b 
... 
>>> f(b="foo", a="bar") 
'barfoo' 

]

+0

これは最良の答えです。一貫性はあり得ません。他の関数_do_は、可変数の引数を使用します。 – Izkata

0

foo(1, 2)間の違いを見分けるためのpythonのためには、foo(1, dtype='int')foo(1, 2, dtype='int')あなたは「werenキーワードのみの引数を使用する必要がありますPython 3まで正式に導入されました。**kargsを使用して、Python 2.xでキーワードのみの引数を実装することは可能ですが、それは不自然でPythonに見えません。私はその理由のためにarrayarray(1, 2)を許可しないが、reshapeはキーワードを取らないのでreshape(1, 2)は大丈夫だと思う。

関連する問題