在numpy中添加2D数组的问题

时间:2013-12-27 15:05:49

标签: python arrays numpy

我有两个尺寸为3x1和3x3的数组ab,我想在这里总结一下:

>>> a = np.arange(3).reshape(3,1)
>>> a
array([[0],
       [1],
       [2]])
>>> b = np.arange(9).reshape(3,3)
>>> b
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
>>> c = a + b

问题是我期待c

array([[0, 1, 2],
       [4, 4, 5],
       [8, 7, 8]])

我的意思是a的第一列添加到b的第一列,但我改为:

>>> c
array([[ 0,  1,  2],
       [ 4,  5,  6],
       [ 8,  9, 10]])

为什么呢?我怎么能做我想做的事?

4 个答案:

答案 0 :(得分:2)

当你添加形状(3,3)和(3,1)的矩阵时,后者得到broadcasted(相当于a-(3,3)),可以认为是:

[0 0 0]
[1 1 1] 
[2 2 2]

但是在你的情况下你只想添加到第一列,所以你应该避免广播操作,并直接添加到第一列,如:

c = b.copy()
c[:,0] += a[:,0]
c
=> 
array([[0, 1, 2],
       [4, 4, 5],
       [8, 7, 8]])

答案 1 :(得分:2)

这些是Numpy的正常broadcasting rules。在这种情况下,列与2D数组的行数相同,因此它将添加到2D数组的所有列中。

如果您只想添加到第一列,请执行以下操作:

c = b.copy()
c[:, :1] += a

答案 2 :(得分:1)

使用numpy.hstack,切片:

>>> import numpy as np
>>> a = np.arange(3).reshape(3,1)
>>> b = np.arange(9).reshape(3,3)
>>> np.hstack([a + b[:,:1], b[:, 1:]]) # a + b[:,:1] to add the first column.
array([[0, 1, 2],
       [4, 4, 5],
       [8, 7, 8]])

>>> c = b.copy()
>>> c[:,:1] += a
>>> c
array([[0, 1, 2],
       [4, 4, 5],
       [8, 7, 8]])

答案 3 :(得分:0)

另一种选择是使用

In [59]: c=np.zeros((3,3),dtype=int); c[:,0]=np.arange(3)

In [60]: c
Out[60]: 
array([[0, 0, 0],
       [1, 0, 0],
       [2, 0, 0]])

或等效而不是a