1

配列になる2つのベクトルの行列乗算をnumpyで実行しようとしています。

In [108]: b = array([[1],[2],[3],[4]])
In [109]: a =array([1,2,3])
In [111]: b.shape
Out[111]: (4, 1)
In [112]: a.shape
Out[112]: (3,)
In [113]: b.dot(a)
ValueError: objects are not aligned

形状からわかるように、配列 a は実際には行列ではありません。キャッチは、このように定義するaことです。

In [114]: a =array([[1,2,3]])    
In [115]: a.shape
Out[115]: (1, 3)    
In [116]: b.dot(a)
Out[116]: 
array([[ 1,  2,  3],
       [ 2,  4,  6],
       [ 3,  6,  9],
       [ 4,  8, 12]])

ベクトルを行列のフィールドまたは列として取得するときに同じ結果を得るにはどうすればよいですか?

In [137]: mat = array([[ 1,  2,  3],
       [ 2,  4,  6],
       [ 3,  6,  9],
       [ 4,  8, 12]])

In [138]: x = mat[:,0]      #[1,2,3,4]
In [139]: y = mat[0,:]      #[1,2,3]
In [140]: x.dot(y)
ValueError: objects are not aligned
4

3 に答える 3

6

2 つのベクトルの外積を計算しています。numpy.outerこれには次の関数を使用できます。

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

In [19]: b
Out[19]: array([10, 20, 30, 40])

In [20]: numpy.outer(b, a)
Out[20]: 
array([[ 10,  20,  30],
       [ 20,  40,  60],
       [ 30,  60,  90],
       [ 40,  80, 120]])
于 2013-04-29T19:51:20.940 に答える
4

1 次元ベクトルの代わりに 2 次元配列を使用し、*...

In [8]: #your code from above

In [9]: y = mat[0:1,:]

In [10]: y
Out[10]: array([[1, 2, 3]])

In [11]: x = mat[:,0:1]

In [12]: x
Out[12]: 
array([[1],
       [2],
       [3],
       [4]])

In [13]: x*y
Out[13]: 
array([[ 1,  2,  3],
       [ 2,  4,  6],
       [ 3,  6,  9],
       [ 4,  8, 12]])
于 2013-04-29T09:08:05.317 に答える
1

基本的な例と同様のキャッチです。

xとはどちらもy行列としてではなく、1 次元配列として認識されます。

In [143]: x.shape
Out[143]: (4,)

In [144]: y.shape
Out[144]: (3,)

それらに 2 番目の次元を追加する必要があります。これは 1 になります。

In [171]: x = array([x]).transpose()
In [172]: x.shape
Out[172]: (4, 1)
In [173]: y = array([y])
In [174]: y.shape
Out[174]: (1, 3)
In [175]: x.dot(y)
Out[175]: 
array([[ 1,  2,  3],
       [ 2,  4,  6],
       [ 3,  6,  9],
       [ 4,  8, 12]])
于 2013-04-29T09:07:42.280 に答える