我有两个尺寸为3x1和3x3的数组a
和b
,我想在这里总结一下:
>>> 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]])
为什么呢?我怎么能做我想做的事?
答案 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
。