我正在尝试解决以下问题:
'''
Take in two matrices as numpy arrays, X and Y. Determine whether they have an inner product.
If they do not, return False. If they do, return the resultant matrix as a numpy array.
'''
使用以下代码:
def mat_inner_product(X,Y):
if X.shape != Y.shape:
return False
else:
return np.inner(X,Y)
我收到以下错误消息:
.F
======================================================================
FAIL: test_mat_inner_product (test_methods.TestPython1)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/usr/src/app/test_methods.py", line 27, in test_mat_inner_product
self.assertTrue(np.array_equal(result2, correct2))
AssertionError: False is not true
----------------------------------------------------------------------
Ran 2 tests in 0.001s
FAILED (failures=1)
这是什么意思"错误不是真的"?我有逻辑错误吗?或者我应该使用.dot()而不是.inner()?有什么区别?
答案 0 :(得分:4)
可以计算内积,因为两个矩阵的最后一个维度相同。因此,您不应该检查X.shape
是否等于Y.shape
,而只检查最后一个维度:
def mat_inner_product(X,Y):
if X.shape[-1] != Y.shape[-1]:
return False
else:
return np.inner(X,Y)
此外,维度的数量 - .ndim
(len(X.shape)
- 也不必相同:您可以使用3d张量计算二维矩阵的内积。< / p>
但您可以省略该检查并使用try
- except
项:
def mat_inner_product(X,Y):
try:
return np.inner(X,Y)
except ValueError:
return False
现在我们只需要依赖numpy
已正确实现内部矩阵逻辑的事实,并且在内部产品无法计算的情况下将引发ValueError
。
或者我应该使用
.dot()
而不是.inner()
?有什么区别?
点积的不同之处在于它与Y
的倒数第二维度(而不是np.inner()
中使用的最后一维)一起使用。因此,如果您使用numpy.dot(..)
,检查将是:
def mat_dot_product(X,Y):
if X.shape[-1] != Y.shape[-2]:
return False
else:
return np.dot(X,Y)
但同样,您可以在此处使用try
- except
结构。