1

これは少し初心者の質問だと思いますが、メソッドだけでなく、モジュールで定義されたクラスのクラスメソッドを使用している状況が提示されたときに使用する、より Pythonic なアプローチについて疑問に思っていますモジュール自体の中で定義されています。例として numpy を使用します。

import numpy as np

foo = np.matrix([[3, 4], [9, 12]])

# Get norm (without using linalg)
norm = np.sqrt(foo.dot(foo.T)).diagonal()

このように、foo のメソッドと numpy で定義されたメソッドを呼び出す混合ケースを使用するか、次のようにコードを記述できます。

norm = np.diagonal(np.sqrt(np.dot(foo, foo.T)))

私自身は foo.bar.baz.shoop.doop 構文を使用したいと思いますが、sqrt は foo のメソッドではないため、この場合はできません。では、このような行を書くより Pythonic な方法は何でしょうか?

ちなみに、補足質問として、モジュールで定義されたメソッドと比較して、クラスメソッドは通常より最適​​化されていますか? 内部で何が起こっているのかよくわかりませんが、numpy には arg が配列または行列になる一般的なケース用に記述された np.dot メソッドがあると仮定しました (再び numpy を例として使用)。 np.matrix.dot は再実装され、マトリックス操作のみに最適化されています。これで間違っている場合は修正してください。

4

1 に答える 1

1

あなたが尋ねている質問には、実際には答えがありません。なぜなら、あなたが尋ねているケースは単に存在しないからです。

通常、Python では、メソッドとグローバル関数として同じ関数を使用することはできません。

NumPy は特殊なケースです。すべてではありませんが、一部のトップレベル関数も適切なオブジェクトのメソッドとして使用できるからです。それでも、多くの場合、同じセマンティクスを持っていないため、答えはスタイルの問題ではなく、どれが正しい機能であるかということです。

たとえば、あなたの場合、選択肢があるのは だけですdiagonal。そして、2 つのオプションは異なる結果をもたらします。

>>> m = matrix([[1,2,3], [4,5,6], [7,8,9]]
>>> np.diagonal(m)
array([1, 5, 9])
>>> m.diagonal()
matrix([[1, 5, 9]])

モジュール関数は、形状 (N, N) の 2D 配列を取り、形状 (N,) の 1D 配列を返します。このメソッドは、形状 (N, N) の 2D マトリックスを取り、形状 (1, N) の 2D マトリックスを返します。

matrixメソッドの方が速くなる可能性があります。しかし、それはどちらかが正しくても、もう一方が間違っているという事実ほど重要ではありません。2 つの数値を掛けるには、またはの方が速いかどう+かを尋ねるようなものです。より速い*かどうかにかかわらず、乗算しないため、乗算する高速な方法ではありません。+*

于 2013-07-12T01:35:42.133 に答える