如果你习惯了 Matlab,Numpy 处理“列”和“行”向量的方式有点奇怪。要意识到的是,一维数组既不是列也不是行向量。要成为列或行向量,数组必须是一维设置为一的二维数组。您可以通过查看有多少个大括号来区分一维数组和一行二维数组:
>>> a = numpy.arange(15)
>>> a
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
>>> b = a.reshape(1, -1)
>>> b
array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]])
现在你可以看到,当你转置这两个时,a 保持不变,但b 变成了一个列向量:
>>> a.T
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
>>> b.T
array([[ 0],
[ 1],
[ 2],
[ 3],
[ 4],
[ 5],
[ 6],
[ 7],
[ 8],
[ 9],
[10],
[11],
[12],
[13],
[14]])
同样,这看起来有点奇怪——但正如您所说,“数组更通用”。为了达到这种普遍性,Numpy 严格区分不同维度的数组。一维数组根本不可能是任何有意义的“列”或“行”向量。根本没有定义第二个维度!
您的其他问题的答案来自此观察。您上面的代码示例代码为我生成了一个错误,所以我会做一些稍微不同的事情......这也会产生一个错误,但信息量更大:
>>> A
array([[1],
[2]])
>>> B
array([2, 4])
>>> numpy.dot(A, B)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: objects are not aligned
Numpy 抱怨对象没有对齐。那是因为 B 是一维数组!让我们把它变成一个真正的行向量:
>>> B = B.reshape(1, -1)
>>> B
array([[2, 4]])
>>> numpy.dot(A, B)
array([[2, 4],
[4, 8]])
>>> numpy.dot(B, A)
array([[10]])
现在一切都说得通了。 Dot 在这里简单地执行矩阵乘法;该操作按一个顺序生成一个 2x2 数组;另一方面,它产生一个 1x1 数组。注意大括号的数量!这两个都是 2-d 数组。反过来,10、[10] 和 [[10]] 都将是不同的结果。
同样,考虑这三个值:
>>> numpy.array(2)
array(2)
>>> numpy.array((2,))
array([2])
>>> numpy.array((2,)).reshape(1,-1)
array([[2]])
如果你将这些传递给numpy.linalg.inv,除了最后一个之外,你会得到所有错误——你不能取非矩阵的矩阵逆!如果通过最后一个,结果也是一个矩阵:
>>> numpy.linalg.inv(numpy.array((2,)).reshape(1,-1))
array([[ 0.5]])