当您执行类似
之类的操作时,为什么numpy不会抛出错误np.ones((5,5)) + np.ones(5)
这种添加在线性代数中没有明确定义,我花了几个小时来追踪一个归结为这个的错误
答案 0 :(得分:4)
np.ones((5,5)) + np.ones(5)
np.ones((5,5)) + np.ones(4) <- This would give a error.
因为np.ones(5)符合每一行的大小,所以它将逐行添加到每一行。
这就是numpy的工作方式。我不是线性代数模块。
这是一个如何做到这一点的简短示例,这需要扩展,具有更多的逻辑和聪明。只是一个概念证明。
import numpy as np
class myMatrixClass(np.ndarray):
def __add__(self,val):
if (hasattr(val, '__iter__') and self.shape != val.shape):
print "not valid addition!"
else:
return super(myMatrixClass, self).__add__(val)
In [33]: A = myMatrixClass( shape=(5,5))
In [34]: A[:] = 1
In [35]: B = A + 1
In [36]: B
Out[36]:
myMatrixClass([[ 2., 2., 2., 2., 2.],
[ 2., 2., 2., 2., 2.],
[ 2., 2., 2., 2., 2.],
[ 2., 2., 2., 2., 2.],
[ 2., 2., 2., 2., 2.]])
In [37]: C = A + np.ones(5)
not valid addition!
答案 1 :(得分:0)
我相信这是因为 numpy 广播较小的数组以适应较大数组的形状。请参阅:http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html
然而,这可能不一定与“正常线性代数”一致。
在上面的文档中已经很好地阐述了它:
a = np.array([1.0, 2.0, 3.0])
b = 2.0
a * b
结果:
array([ 2., 4., 6.])