为什么numpy允许你添加不同大小的数组?

时间:2013-12-13 11:55:04

标签: python arrays numpy

当您执行类似

之类的操作时,为什么numpy不会抛出错误
np.ones((5,5)) + np.ones(5)

这种添加在线性代数中没有明确定义,我花了几个小时来追踪一个归结为这个的错误

2 个答案:

答案 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.])