慕后森
不要将数学中使用的维度的含义与 numpy 中的维度混淆。你的第一个矩阵的形状是 (5,3),这是正确的。它的维度为 2。第二个向量不是 numpy 的 3x1 矩阵。它的形状为 (3,),维度为 1:wb0 = np.array([ 1.0, 1.0, 1.0])numpy 的等效 3x1 矩阵如下:wb1 = numpy.array([[1.0], [1.0], [1.0]])print(wb1)print("shape wb1",wb1.shape)如您所见,这里我们有两个维度来wb1比较wb0。虽然wb0在您看来是 3x1 矩阵,但对于 numpy,它是一个 (3,) 矩阵。的 1x3 矩阵wb01如下:wb2 = numpy.array([[1.0, 1.0, 1.0]])print(wb2)print("shape wb0",wb2.shape)因此,numpy 中的维度和形状不同于一般代数中用于矩阵的维度。可以在以下线程中找到非常详尽的解释:Difference between numpy.array shape (R, 1) and (R,)在您的情况下,numpy 能够在 (5,3) 矩阵和 (3,) 矩阵之间进行矩阵乘法的原因是dot函数的实现:如果 a 是 ND 数组且 b 是一维数组,则它是 a 和 b 的最后一个轴上的和积。如果对 (5,3) 矩阵和 (3,1) 矩阵使用点函数,您会得到相同的结果:import numpyX = numpy.array([[4.6, 3.4, 1.4], [6.5, 3.2, 5.1], [5.7, 2.9, 4.2], [6.6, 3., 4.4], [6., 2.9, 4.5]])print(X)print(X.shape)print("")wb0 = numpy.array([0.0, 1.0, 1.0, 1.0])print(wb0)print("shape wb0",wb0.shape)print()w = numpy.array([[1.0], [1.0], [1.0]])print(w)print("shape w",w.shape)print("")print(numpy.dot(X,w)) 唯一的区别是,在您的情况下,最终结果的形状为 (5,),而在第二种情况下,结果的形状为 (5,1)。