19

1Dで配列(線形代数のベクトル)を処理する方法を理解しようとしていNumPyます。

次の例では、2 つの と を生成numpy.array abます。

>>> import numpy as np
>>> a = np.array([1,2,3])
>>> b = np.array([[1],[2],[3]]).reshape(1,3)
>>> a.shape
(3,)
>>> b.shape
(1, 3)

私にとっては、線形代数の定義に従って同じ形状ab持っています:1行、3列ですが、NumPy.

さて、NumPy dot製品:

>>> np.dot(a,a)
14
>>> np.dot(b,a)
array([14])
>>> np.dot(b,b)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: objects are not aligned

私は3つの異なる出力を持っています。

dot(a,a)とはどう違いdot(b,a)ますか?ドット(b,b)が機能しないのはなぜですか?

また、これらの内積にはいくつかの違いがあります。

>>> c = np.ones(9).reshape(3,3)
>>> np.dot(a,c)
array([ 6.,  6.,  6.])
>>> np.dot(b,c)
array([[ 6.,  6.,  6.]])
4

1 に答える 1

21

1D 配列だけを扱っているわけではないことに注意してください。

In [6]: a.ndim
Out[6]: 1

In [7]: b.ndim
Out[7]: 2

だから、b2D配列です。の出力にもこれが表示されますb.shape: (1,3) は 2 つの次元を示し、(3,) は 1 つの次元です。

の動作はnp.dot、1D 配列と 2D 配列では異なります ( docsから)。

2 次元配列の場合は行列の乗算に相当し、1 次元配列の場合はベクトルの内積に相当します。

これが、1D 配列と 2D 配列を混合しているため、異なる結果が得られる理由です。bは 2D 配列であるためnp.dot(b, b)、2 つの 1x3 行列で行列の乗算を試みますが、失敗します。


1D 配列では、np.dot はベクトルの内積を計算します。

In [44]: a = np.array([1,2,3])

In [45]: b = np.array([1,2,3])

In [46]: np.dot(a, b)
Out[46]: 14

In [47]: np.inner(a, b)
Out[47]: 14

2D 配列では、行列の乗算になります (つまり、1x3 x 3x1 = 1x1、または 3x1 x 1x3 = 3x3)。

In [49]: a = a.reshape(1,3)

In [50]: b = b.reshape(3,1)

In [51]: a
Out[51]: array([[1, 2, 3]])

In [52]: b
Out[52]:
array([[1],
       [2],
       [3]])

In [53]: np.dot(a,b)
Out[53]: array([[14]])

In [54]: np.dot(b,a)
Out[54]:
array([[1, 2, 3],
       [2, 4, 6],
       [3, 6, 9]])

In [55]: np.dot(a,a)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-55-32e36f9db916> in <module>()
----> 1 np.dot(a,a)

ValueError: objects are not aligned
于 2013-03-28T11:38:22.547 に答える