向量和数组的NP数组点积

ankyAS

我在理解numpy点函数和广播背后的工作时遇到问题。以下是我试图了解的代码段

a=np.array([[1,2],[3,5]])

如果我们检查一个的形状,a.shape它将是(2,2)

b=np.array([3,6])b.shape is (2,)

问题1:是b列向量还是行向量?在提供输入时,似乎b是行向量,但形状将其显示为具有2行的列向量。我的理解是什么错?

现在,如果这样做a.dot(b)会导致array([15,39])

问题2:按矩阵乘法如果am*nb必须n*k并且由于a是2×2然后b必须是2 * 1。这是否验证了b是否为列向量,否则是否将是行向量,那么矩阵乘法将是不可能的,但是点积的输出确实会根据矩阵乘法给出值,b并将其视为列向量并进行广播

现在b.dot(a)也有可能,结果令array([21,36])我大吃一惊。他们如何检查矩阵乘法的向量的兼容性,以及如何计算?在至少一种情况下,他们必须为不兼容的维数进行乘法运算以引发错误,但未显示出来,并且在两种情况下都在计算结果。

Hamzaan dle绳

该numpy的编程装置,其一个一维阵列,所述方式shape=(n,),作为处理既不一列或行向量,而是可以作用像基于在点积的位置的任何一个。为了更好地解释这一点,请考虑将不对称数组与对称数组的情况进行比较:

>>>a=numpy.arange(3)
>>>a.shape=(1,3)
>>>a
array([0,1,2])

>>>b=numpy.arange(9)
>>>b.shape=(3,3)
>>>b
array([0,1,2]
      [3,4,5]
      [6,7,8])

然后定义一个(3,)向量:

>>>c=numpy.arange(3)
>>>c
array([0,1,2])
>>>c.shape
(3,)

在正常线性代数中,如果c是列向量,我们期望ac用3x1列向量生成一个常数的1x3矩阵点,而ca则生成3x3矩阵,即3x1列乘以1x3行。在python中执行此操作,您会发现a.dot(c)将生成(1,)数组(我们期望的常量),但c.dot(a)会引发错误:

>>>d=a.dot(c)
d.shape=(1,)
>>>e=c.dot(a)
ValueError: shapes (3,) and (1,3) not aligned: 3 (dim 0) != 1 (dim 0)

出问题的是,该numpy对照a的第一个维检查了c唯一维,而不针对a检查了c最后维。根据numpy,一维数组只有一个维,并且所有检查都针对该维。因此,我们发现一维数组不能严格用作列或行向量。例如b.dot(c)检查B的针对c的(c中的一个维度的第二维度的作用像列向量),并c.dot(b)检查C的一个维度对B的第一尺寸(C作用就像一个行向量)。因此,它们都起作用:

>>>f=b.dot(c)
>>>f
array([ 5, 14, 23])

>>>g=c.dot(b)
>>>g
array([15, 18, 21]) 

为避免这种情况,必须为数组指定第二维,使其成为行向量或列向量。在此示例中,您将明确表示c.shape=(3,1)对于列向量或c.shape=(1,3)行向量。

>>>c.shape=(3,1)
>>>c.dot(a)
array([0,0,0]
      [0,1,2]
      [0,2,4])
>>>h=c.dot(b)
ValueError: shapes (3,1) and (3,3) not aligned: 1 (dim 1) != 3 (dim 0)


>>>c.shape=(1,3) 
>>>i=c.dot(b)
>>>i
array([[15, 18, 21]])

得出的结论是:根据numpy,行向量和列向量具有二维

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章