2013-03-28 174 views
14

numpyで1D配列(線形代数のベクトル)を扱う方法を理解しようとしています。次の例では、私は2つのnumpy.array aとbの生成:1行、3列ではなく、numpyのために:私にとってnumpy:さまざまな形状の1D配列

>>> 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) 

を、a及びbは、線形代数の定義に従って同じ形状を有しています。今

、numpyの内積:

>>> 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つの異なる出力を持っています。ドット(a、a)とドット(b、a)の違いは何ですか?なぜドット(b、b)がうまくいかないのですか?

は、私はまた、これらのドット積といくつかのdifferenciesを持っている:あなただけの1次元配列で使用されていない

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

答えて

16

お知らせ:

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

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

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

np.dotの挙動は、1Dおよび2Dアレイ(docsから)で異なる:2Dアレイの場合

それは行列の乗算に相当し、1D アレイ用の内積にベクトル

これは、1次元配列と2次元配列を混在させるため、異なる結果が得られる理由です。 bは2D配列なので、np.dot(b, b)は2つの1x3行列で行列乗算を試みますが、失敗します。 1Dアレイと


、np.dotはベクトルの内積ん、それは行列乗算(SO X 1×3 3×1 = 1×1、または3×1 X 1×3次元アレイと

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 

あります= 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 
+0

答えに感謝します。それで、もしnumpyで線形代数をしたいのなら、ベストプラクティスは何ですか? 2Dのnumpy.arrayですべてのベクトルを変換しますか?私は2つの異なる形でちょっと混乱しています... – Marcel

+0

私は多くの線形代数を自分でやっていませんが、これはあなたが正確にやりたいことに依存していると思います。ただベクトル製品や他の簡単な操作/計算、その後1Dは正常です。行列計算などを行う場合は、2Dを使用する必要があります。 – joris

+3

ベストプラクティスは、ベクトルを表す1次元配列と行列を表す2次元配列を使用することです。配列の魔法のためには、主に形状が(1、3)の2次元配列のような構成が必要ですが、標準の線形代数は必要ありません。線形代数に関しては、これは '1x3'行列のあまり有用でないオブジェクトに対応するでしょう。 – flonk

関連する問題