我在理解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:按矩阵乘法如果a
是m*n
则b
必须n*k
并且由于a
是2×2然后b
必须是2 * 1。这是否验证了b
是否为列向量,否则是否将是行向量,那么矩阵乘法将是不可能的,但是点积的输出确实会根据矩阵乘法给出值,b
并将其视为列向量并进行广播
现在b.dot(a)
也有可能,结果令array([21,36])
我大吃一惊。他们如何检查矩阵乘法的向量的兼容性,以及如何计算?在至少一种情况下,他们必须为不兼容的维数进行乘法运算以引发错误,但未显示出来,并且在两种情况下都在计算结果。
该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] 删除。
我来说两句