numpy.dot函数矩阵乘法:Numpy将AxB矩阵和1xB矩阵相乘,作为AxB矩阵和Bx1矩阵

时间:2020-04-30 10:24:54

标签: python numpy matrix

在下面的代码中,我必须将5x3矩阵与矢量相乘。在我看来,向量似乎是1x3矩阵,但是python将其视为3x1矩阵。

为什么代码中的w在3x1矩阵下面,或者为什么python使它成为3x1矩阵?

谢谢。

import numpy

X = 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 = wb0[1:]
print(w)
print("shape w",w.shape)

print("")
print(numpy.dot(X,w)) 

2 个答案:

答案 0 :(得分:0)

numpy.dot()中的计算很大程度上取决于您的输入变量。文档字符串给出:

dot(a,b,out = None)

[...]

  • 如果a是一个N维数组,而b是一维数组,则它是 ab的最后一个轴。
  • 如果ab均为二维数组,则为矩阵乘法, 但最好使用:func:matmula @ b

[...]

如果要使用矩阵乘法,必须将w定义为二维数组:

wb0 = numpy.array([[0.0, 1.0, 1.0, 1.0]])
w = wb0[0,1:]

答案 1 :(得分:0)

不要混淆数学中使用的维和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,)矩阵。
wb01的1x3矩阵如下:

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是一个N-D数组而b是一维数组,则它是 a和b的最后一个轴。

如果对(5,3)矩阵和(3,1)矩阵使用点函数,将会得到相同的结果:

import numpy

X = 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)。

相关问题