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