## 对于NumPy矩阵和Array类，乘法有什么不同？内容来源于 Stack Overflow，并遵循CC BY-SA 3.0许可协议进行翻译与使用

• 回答 (2)
• 关注 (0)
• 查看 (43)

numpy文档建议使用数组而不是矩阵来处理矩阵。然而，*不执行矩阵乘法，需要使用MatxMultipy()函数。怎么理解？

### 2 个回答

```>>> from numpy import linalg as LA
>>> import numpy as NP

>>> a1 = NP.matrix("4 3 5; 6 7 8; 1 3 13; 7 21 9")
>>> a1
matrix([[ 4,  3,  5],
[ 6,  7,  8],
[ 1,  3, 13],
[ 7, 21,  9]])

>>> a2 = NP.matrix("7 8 15; 5 3 11; 7 4 9; 6 15 4")
>>> a2
matrix([[ 7,  8, 15],
[ 5,  3, 11],
[ 7,  4,  9],
[ 6, 15,  4]])

>>> a1.shape
(4, 3)

>>> a2.shape
(4, 3)

>>> a2t = a2.T
>>> a2t.shape
(3, 4)

>>> a1 * a2t         # same as NP.dot(a1, a2t)
matrix([[127,  84,  85,  89],
[218, 139, 142, 173],
[226, 157, 136, 103],
[352, 197, 214, 393]])```

```>>> a1 = NP.array(a1)
>>> a2t = NP.array(a2t)

>>> a1 * a2t
Traceback (most recent call last):
File "<pyshell#277>", line 1, in <module>
a1 * a2t
ValueError: operands could not be broadcast together with shapes (4,3) (3,4) ```

```>> NP.dot(a1, a2t)
array([[127,  84,  85,  89],
[218, 139, 142, 173],
[226, 157, 136, 103],
[352, 197, 214, 393]])```

```>>> m = NP.random.randint(0, 10, 16).reshape(4, 4)
>>> m
array([[6, 2, 5, 2],
[8, 5, 1, 6],
[5, 9, 7, 5],
[0, 5, 6, 7]])

>>> type(m)
<type 'numpy.ndarray'>

>>> md = LA.det(m)
>>> md
1772.9999999999995```

```>>> LA.eig(m)
(array([ 19.703+0.j   ,   0.097+4.198j,   0.097-4.198j,   5.103+0.j   ]),
array([[-0.374+0.j   , -0.091+0.278j, -0.091-0.278j, -0.574+0.j   ],
[-0.446+0.j   ,  0.671+0.j   ,  0.671+0.j   , -0.084+0.j   ],
[-0.654+0.j   , -0.239-0.476j, -0.239+0.476j, -0.181+0.j   ],
[-0.484+0.j   , -0.387+0.178j, -0.387-0.178j,  0.794+0.j   ]]))```

```>>>> LA.norm(m)
22.0227```

QR分解:

```>>> LA.qr(a1)
(array([[ 0.5,  0.5,  0.5],
[ 0.5,  0.5, -0.5],
[ 0.5, -0.5,  0.5],
[ 0.5, -0.5, -0.5]]),
array([[ 6.,  6.,  6.],
[ 0.,  0.,  0.],
[ 0.,  0.,  0.]]))```

```>>> m = NP.random.rand(40).reshape(8, 5)
>>> m
array([[ 0.545,  0.459,  0.601,  0.34 ,  0.778],
[ 0.799,  0.047,  0.699,  0.907,  0.381],
[ 0.004,  0.136,  0.819,  0.647,  0.892],
[ 0.062,  0.389,  0.183,  0.289,  0.809],
[ 0.539,  0.213,  0.805,  0.61 ,  0.677],
[ 0.269,  0.071,  0.377,  0.25 ,  0.692],
[ 0.274,  0.206,  0.655,  0.062,  0.229],
[ 0.397,  0.115,  0.083,  0.19 ,  0.701]])
>>> LA.matrix_rank(m)
5```

```>>> a1 = NP.random.randint(1, 10, 12).reshape(4, 3)
>>> LA.cond(a1)
5.7093446189400954```

```>>> a1 = NP.matrix(a1)
>>> type(a1)
<class 'numpy.matrixlib.defmatrix.matrix'>

>>> a1.I
matrix([[ 0.028,  0.028,  0.028,  0.028],
[ 0.028,  0.028,  0.028,  0.028],
[ 0.028,  0.028,  0.028,  0.028]])
>>> a1 = NP.array(a1)
>>> a1.I

Traceback (most recent call last):
File "<pyshell#230>", line 1, in <module>
a1.I
AttributeError: 'numpy.ndarray' object has no attribute 'I'```

```>>> LA.pinv(m)
matrix([[ 0.314,  0.407, -1.008, -0.553,  0.131,  0.373,  0.217,  0.785],
[ 1.393,  0.084, -0.605,  1.777, -0.054, -1.658,  0.069, -1.203],
[-0.042, -0.355,  0.494, -0.729,  0.292,  0.252,  1.079, -0.432],
[-0.18 ,  1.068,  0.396,  0.895, -0.003, -0.896, -1.115, -0.666],
[-0.224, -0.479,  0.303, -0.079, -0.066,  0.872, -0.175,  0.901]])

>>> m = NP.array(m)

>>> LA.pinv(m)
array([[ 0.314,  0.407, -1.008, -0.553,  0.131,  0.373,  0.217,  0.785],
[ 1.393,  0.084, -0.605,  1.777, -0.054, -1.658,  0.069, -1.203],
[-0.042, -0.355,  0.494, -0.729,  0.292,  0.252,  1.079, -0.432],
[-0.18 ,  1.068,  0.396,  0.895, -0.003, -0.896, -1.115, -0.666],
[-0.224, -0.479,  0.303, -0.079, -0.066,  0.872, -0.175,  0.901]])```

```import numpy as np
x = np.arange(9).reshape((3,3))
y = np.arange(3)

print np.dot(x,y)```