1. Numpy 一维数组

我发现 Numpy 中的一维数组既可以是行向量也可以是列向量:

import numpy as np
a = np.array([1, 2, 3])

In [18]: a.shape
(3,)

In [19]: a.T.shape
(3,)

可以发现,一维数组的转置就是它自身。
若在定义数组时,里面有两个中括号,就是一个行向量了。

b = np.array([[1, 2, 3]])
In [24]: b.shape
(1, 3)

在调用 gurobi 添加矩阵约束条件时,注意决策变量要用一维数组定义。

2. 矩阵相乘符号 @

Python 从 3.5 后引入了符号 @, 表示矩阵的相乘。但若 numpy 的二维数组与一维数组做矩阵乘法,一维数组被视作列向量,得出的结果为一个行向量。例如:

a = np.array([1, 2, 3])
B = np.array([[-4, 2, -3], [-2, -3, 1]])
In [31]: B@a
Out [31]:
array([-9, -5])

但若 numpy 的一维数组与一维数组做矩阵乘法,则视作一个行向量与列向量相乘,结果为一个值。例如:

In [13]: a = np.array([1, 2])

In [14]: b = np.array([3, 4])

In [15]: a@b
Out[15]: 11

总之, 符号 @ 的运算有点奇怪:都是二维时,等价于数学意义中的矩阵乘法运算;但若是一维时,按前面两种情况来。

若是 * 号,则是点乘:

In [30]: B*a
Out [30]:
array([[-4,  4, -9],
       [-2, -6,  3]])