6

を使用してnumpy.matrixいます。、または、ベクトルを含む3x3行列を追加すると、行列が返されます。1x33x13x3

これはすべきではありませんundefinedか?そうでない場合、これに対する説明は何ですか?

例:

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

2 に答える 2

9

これを「放送」といいます。マニュアルから:

ブロードキャストという用語は、算術演算中に numpy が異なる形状の配列をどのように扱うかを表しています。特定の制約を条件として、小さい方の配列が大きい方の配列全体に「ブロードキャスト」されるため、形状に互換性があります。ブロードキャストは、Python ではなく C でループが発生するように、配列操作をベクトル化する手段を提供します。データの不必要なコピーを作成せずにこれを行うため、通常は効率的なアルゴリズムの実装につながります。ただし、メモリの非効率的な使用につながり、計算速度が低下するため、ブロードキャストが悪い考えである場合があります。

于 2013-04-01T13:30:53.530 に答える
5

行列にベクトルを追加したい場合は、追加する場所を選択することで実行できます。

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。実際、あなたが使用しているのは、ではなく を返すnumpy.ndarrayためです。np.onesndarraymatrix

追加は同じですが、いくつかの行列を作成すると、それらの動作が異なることがわかります。

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.]])
于 2013-04-01T13:55:06.223 に答える