我无法真正解释其中的原因,因为我经常使用np.matrix而不是np.array来防止这种事情。感谢@Jaime 在上面评论中的链接,很明显这np.matrix只是一个np.ndarray重新定义的中缀操作的子类,其中线性代数有适当的答案。在没有的地方,它依赖于np.ndarraywith的规则ndim = 2。
似乎加法遵循矩阵乘法规则,其中哪些元素A与 中的哪些元素配对B:
In [1]: import numpy as np
In [2]: A = np.matrix([1,2,3]).T
In [3]: B = np.matrix([1,1,1])
In [4]: A
Out[4]: 
matrix([[1],
        [2],
        [3]])
In [5]: B
Out[5]: matrix([[1, 1, 1]])
In [6]: A+B
Out[6]: 
matrix([[2, 2, 2],
        [3, 3, 3],
        [4, 4, 4]])
In [7]: A*B
Out[7]: 
matrix([[1, 1, 1],
        [2, 2, 2],
        [3, 3, 3]])
这与您得到的行为相同np.array:
In [9]: a = np.arange(3)[...,None]
In [10]: b = np.arange(3)
In [11]: a
Out[11]: 
array([[0],
       [1],
       [2]])
In [12]: b
Out[12]: array([0, 1, 2])
In [13]: a+b
Out[13]: 
array([[0, 1, 2],
       [1, 2, 3],
       [2, 3, 4]])