我是numpy的新手,发现了这样的奇怪(对我来说)行为。 我正在实现逻辑回归成本函数,这里我有2个具有相同维度和相同类型(dfloat)的列向量。 y包含一堆零和一,并且包含范围(-1,1)中的浮点数。 在某些时候我应该得到点积,所以我转置一个并乘以它们:
x = y.T @ a
但是当我使用
时 x = y @ a.T
偶尔性能下降约3次,而结果是相同的 为什么会这样?不是运营是一样的吗? 感谢。
答案 0 :(得分:0)
性能下降,和你会得到一个非常不同的答案!
对于向量乘法(与数字乘法不同)a @ b != b @ a
。在您的情况下(假设列向量),a.T @ b
是数字,但a @ b.T
是一个完整的矩阵!因此,如果您的向量都是形状(1,y),则最后一个操作将产生(y,y)矩阵,这可能非常大。当然,计算这样一个矩阵(也就是添加大量数字并生成大量数字)需要花费更多时间,而不是添加一堆数字而生成一个数字
这就是矩阵(或向量)乘法的工作原理。
答案 1 :(得分:0)
那些是完全不同的东西。考虑
a
如果b
和n
的大小均为n^2
,则第一个的结果为1,第二个的结果为n
。原因是标准标量乘法 - 单元格i,j是产品的第i行和第j列的点积的结果。在你的情况下:
n
结果,单元格(1,1)...(1,n)。冲洗并重复{{1}}次(柱的大小),你有一个更大的矩阵。底线 - 第二个表达式必须做更多算术(可能更多,取决于尺寸)。