2013-04-01 11 views
5

numpy.matrixを使用しています。私は3x3行列を1x3、または3x1ベクトルで追加します。私は3x3の行列を返します。 これは '定義されていない'べきですか? もしそうでなければ、これに対する説明は何ですか?ナンシー行列+列ベクトル

a = np.matrix('1 1 1; 1 1 1; 1 1 1') 
b = np.matrix('1 1 1') 
a + b #or a + np.transpose(b) 

出力:これは、 "放送" と呼ばれている

matrix([[2, 2, 2], 
     [2, 2, 2], 
     [2, 2, 2]]) 

答えて

7

The term broadcasting describes how numpy treats arrays with different shapes during arithmetic operations. Subject to certain constraints, the smaller array is “broadcast” across the larger array so that they have compatible shapes. Broadcasting provides a means of vectorizing array operations so that looping occurs in C instead of Python. It does this without making needless copies of data and usually leads to efficient algorithm implementations. There are, however, cases where broadcasting is a bad idea because it leads to inefficient use of memory that slows computation.

+0

感謝を。そのコンセプトはまだ理解されていませんでしたが、エラーメッセージで既にそれを指摘していましたが、「ValueError:オペランドを図形とともにブロードキャストできませんでした...」 – andershqst

5

あなたは行列にベクトルを追加したいならば、あなたはそれが行くべき場所を選択することで、そうすることができます:manualから

In [155]: ma = np.matrix(
    ...:  [[ 1., 1., 1.], 
    ...:  [ 1., 1., 1.], 
    ...:  [ 1., 1., 1.]]) 

In [156]: mb = np.matrix([[1,2,3]]) 

In [157]: ma[1] += mb # second row 

In [158]: ma 
Out[158]: 
matrix([[ 1., 1., 1.], 
     [ 2., 3., 4.], 
     [ 1., 1., 1.]]) 

In [159]: ma[:,1] += mb.T # second column 

In [160]: ma 
Out[160]: 
matrix([[ 1., 2., 1.], 
     [ 2., 5., 4.], 
     [ 1., 4., 1.]]) 

しかし、私はあることを警告したいのですが前述のようにnumpy.matrixを使用していません。実際には、np.onesndarrayを返し、matrixを返さないので、numpy.ndarrayを使用しています。

加えることは同じですが、いくつかの行列を作成し、あなたは彼らが異なる挙動を示すことがわかります。それを説明する

In [161]: ma*mb 
--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 

ValueError: matrices are not aligned 

In [162]: mb*ma 
Out[162]: matrix([[ 6., 6., 6.]]) 

In [163]: ma*mb.T 
Out[163]: 
matrix([[ 6.], 
     [ 6.], 
     [ 6.]]) 

In [164]: aa = np.ones((3,3)) 

In [165]: ab = np.arange(1,4) 

In [166]: aa*ab 
Out[166]: 
array([[ 1., 2., 3.], 
     [ 1., 2., 3.], 
     [ 1., 2., 3.]]) 

In [167]: ab*aa 
Out[167]: 
array([[ 1., 2., 3.], 
     [ 1., 2., 3.], 
     [ 1., 2., 3.]]) 
+0

Arhはい、あなたは行列について正しいです。私は私の質問を修正します。しかし、私の質問は、放送が受け入れられた答えの中で指摘されているように動作するように思われる追加のためです。 – andershqst

+0

はい、してください。予期せぬ予期しない動作について警告したかっただけです。 – askewchan

+0

はい、ありがとうございます。 – andershqst

関連する問題