numpy向量乘法速度?

时间:2018-06-06 15:57:48

标签: python numpy

我是numpy的新手,发现了这样的奇怪(对我来说)行为。 我正在实现逻辑回归成本函数,这里我有2个具有相同维度和相同类型(dfloat)的列向量。 y包含一堆零和一,并且包含范围(-1,1)中的浮点数。 在某些时候我应该得到点积,所以我转置一个并乘以它们:

   x = y.T @ a

但是当我使用

   x = y @ a.T

偶尔性能下降约3次,而结果是相同的 为什么会这样?不是运营是一样的吗? 感谢。

2 个答案:

答案 0 :(得分:0)

性能下降,你会得到一个非常不同的答案!

对于向量乘法(与数字乘法不同)a @ b != b @ a。在您的情况下(假设列向量),a.T @ b数字,但a @ b.T是一个完整的矩阵!因此,如果您的向量都是形状(1,y),则最后一个操作将产生(y,y)矩阵,这可能非常大。当然,计算这样一个矩阵(也就是添加大量数字并生成大量数字)需要花费更多时间,而不是添加一堆数字而生成一个数字

这就是矩阵(或向量)乘法的工作原理。

答案 1 :(得分:0)

那些是完全不同的东西。考虑

a

如果bn的大小均为n^2,则第一个的结果为1,第二个的结果为n。原因是标准标量乘法 - 单元格i,j是产品的第i行和第j列的点积的结果。在你的情况下:

  1. 第一行是列的一行。所以这里只是向量的点积 - 1维。
  2. 第二列是一列时间。乘法仍然是row *列,所以你将第一个向量的行(一个列,所以是一个单元格)与第二个的第一列(一行,仍然是一个单元格)相乘 - 这给出了结果单元格(1, 1)。您可以对整个行中的第一个列单元格重复相同的操作,即第二个向量 - n结果,单元格(1,1)...(1,n)。冲洗并重复{{1}}次(柱的大小),你有一个更大的矩阵。
  3. 底线 - 第二个表达式必须做更多算术(可能更多,取决于尺寸)。