13

私が読んでいるいくつかのコードには、これに苦しむpython ndarray tempがあります:

x = temp**2

これはドット スクエア (つまり、m.*m と同等) ですか、それともマトリックス スクエア (つまり、m は正方マトリックスでなければなりません) ですか? 特に、このコードで転置を取り除くことができるかどうか知りたいです:

temp = num.transpose(whatever)
num.sum(temp**2,axis=1))

そしてそれをこれに変えます:

num.sum(whatever**2,axis=0)

これにより、少なくとも 0.1 ミリ秒節約でき、明らかに時間を費やす価値があります。
ありがとう!** 演算子はググることができず、私は何も知りません! a

4

3 に答える 3

14

これは、各要素の正方形にすぎません。

from numpy import *
a = arange(4).reshape((2,2))
print a**2

プリント

[[0 1]
 [4 9]]
于 2009-08-29T01:54:48.343 に答える
5

**はPythonの累乗演算子であるため、Pythonではx**2「xsquared」を意味します(numpyを含む)。numpyでのこのような操作は常に要素ごとに適用されるため、配列の各要素(次元数に関係なく)をx**22乗すると、たとえば、各要素が2倍になるか、各要素が2つインクリメントされます(いずれの場合も、適切なものは影響を受けません。結果は、 !)と同じ形状の新しい一時配列です。xx*2x+2xx

編集:@ kaizer.zeが指摘しているように、私が書いたものはオブジェクトにも当てはまりますが、オブジェクトにnumpy.arrayは適用されませんnumpy.matrix。乗算は、forのような要素ごとの演算ではなく行列の乗算を意味しますarray(同様に累乗)-確かに、それが2つのタイプの主な違いです。Scipyチュートリアルで説明されているように、たとえば次のようになります。

numpy.arrayまたはnumpy.matrixを使用する場合、違いがあります。後者の場合、A * xは行列の積になり、配列のように要素ごとの積にはなりません。

つまり、numpyリファレンスがそれを置くように:

行列は、操作を通じて2次元の性質を保持する特殊な2次元配列です。*(行列の乗算)や(行列の累乗)などの特定の特殊な演算子があり**ます。

于 2009-08-29T02:04:01.297 に答える
5

NumPy for Matlab Usersを読む必要があります。そこでは要素ごとのべき乗演算が言及されており、numpy では、一部の演算子がarrayandに異なる方法で適用されることもわかりますmatrix

>>> from numpy import *
>>> a = arange(4).reshape((2,2))
>>> print a**2
[[0 1]
 [4 9]]
>>> print matrix(a)**2
[[ 2  3]
 [ 6 11]]
于 2009-08-29T15:17:41.940 に答える