Numpy ndarray 乘法切换到矩阵乘法
Numpy ndarray multiplication switching to matrix multiplication
这是我收到的错误:
File "/data/eduardoj/linear.py", line 305, in _fit_model
de_dl = (dl_dt + de_dt) * dt_dl
File "/data/eduardoj/MSc-env/lib/python3.4/site-packages/numpy/matrixlib/defmatrix.py", line 343, in __mul__
return N.dot(self, asmatrix(other))
ValueError: shapes (1,53097) and (1,53097) not aligned: 53097 (dim 1) != 1 (dim 0)
这是崩溃的 numpy 代码片段:
340 def __mul__(self, other):
>* 341 if isinstance(other, (N.ndarray, list, tuple)) :
342 # This promotes 1-D vectors to row vectors
343 return N.dot(self, asmatrix(other))
344 if isscalar(other) or not hasattr(other, '__rmul__') :
345 return N.dot(self, other)
346 return NotImplemented
(那里有个断点>*
)
在我的脚本中,我有一个包含以下行的循环:
de_dl = (dloss_dt + dr_dt) * dt_dl
de_dl
、dloss_dt
、dr_dt
和 dt_dl
的预期类型和形状是:
ndarray float32 (1, 53097)
所以,我只想计算逐元素乘法。我正在使用 pudb3 调试我的脚本。我在第一次迭代 (i == 0
) 中检查过它工作得很好(最初产生零)。我注意到对于第一次迭代,线程 NOT 到达了我设置的断点。在下一次迭代(i==1
)中,我决定在调用乘法之前停下来只是为了确保 dloss_dt
、dr_dt
和 dt_dl
的类型和形状是还是一样。他们是。
虽然它们是相同的,但程序似乎经历了一组不同的步骤,并且一些如何以这种 N.dot
乘法结束。
所以,我想知道是什么让我无法进行简单的逐元素乘法运算。
您在问题中显示的 numpy 源代码片段对应于 __mul__
method of np.matrixlib.defmatrix.matrix
.
当您将一个矩阵对象与另一个矩阵或数组右乘时调用此方法,即如果 A
是一个矩阵(它不是' B
是 ndarray 还是矩阵并不重要。
如果 可能 调用该方法的唯一方法是 (dl_dt + de_dt)
是矩阵(或其他派生矩阵 class)而不是 ndarray .因此,dl_dt
或 de_dt
被转换为代码中某处的矩阵。
由于 __mul__
未在第一次迭代中调用,因此这必须发生在代码中第 305 行之后的某处 (de_dl = (dl_dt + de_dt) * dt_dl
)。
这是我收到的错误:
File "/data/eduardoj/linear.py", line 305, in _fit_model
de_dl = (dl_dt + de_dt) * dt_dl
File "/data/eduardoj/MSc-env/lib/python3.4/site-packages/numpy/matrixlib/defmatrix.py", line 343, in __mul__
return N.dot(self, asmatrix(other))
ValueError: shapes (1,53097) and (1,53097) not aligned: 53097 (dim 1) != 1 (dim 0)
这是崩溃的 numpy 代码片段:
340 def __mul__(self, other):
>* 341 if isinstance(other, (N.ndarray, list, tuple)) :
342 # This promotes 1-D vectors to row vectors
343 return N.dot(self, asmatrix(other))
344 if isscalar(other) or not hasattr(other, '__rmul__') :
345 return N.dot(self, other)
346 return NotImplemented
(那里有个断点>*
)
在我的脚本中,我有一个包含以下行的循环:
de_dl = (dloss_dt + dr_dt) * dt_dl
de_dl
、dloss_dt
、dr_dt
和 dt_dl
的预期类型和形状是:
ndarray float32 (1, 53097)
所以,我只想计算逐元素乘法。我正在使用 pudb3 调试我的脚本。我在第一次迭代 (i == 0
) 中检查过它工作得很好(最初产生零)。我注意到对于第一次迭代,线程 NOT 到达了我设置的断点。在下一次迭代(i==1
)中,我决定在调用乘法之前停下来只是为了确保 dloss_dt
、dr_dt
和 dt_dl
的类型和形状是还是一样。他们是。
虽然它们是相同的,但程序似乎经历了一组不同的步骤,并且一些如何以这种 N.dot
乘法结束。
所以,我想知道是什么让我无法进行简单的逐元素乘法运算。
您在问题中显示的 numpy 源代码片段对应于 __mul__
method of np.matrixlib.defmatrix.matrix
.
当您将一个矩阵对象与另一个矩阵或数组右乘时调用此方法,即如果 A
是一个矩阵(它不是' B
是 ndarray 还是矩阵并不重要。
如果 可能 调用该方法的唯一方法是 (dl_dt + de_dt)
是矩阵(或其他派生矩阵 class)而不是 ndarray .因此,dl_dt
或 de_dt
被转换为代码中某处的矩阵。
由于 __mul__
未在第一次迭代中调用,因此这必须发生在代码中第 305 行之后的某处 (de_dl = (dl_dt + de_dt) * dt_dl
)。