使用2D数组的col对1D数组求和

时间:2014-05-22 19:51:45

标签: python numpy

我想知道为什么这个问题永远不会被其他人提出来(也许它是如此愚蠢但我需要它)而我自己也无法弄明白。我想将一维数组添加到2D数组的特定列或行。我在这里做的方式听起来真的很愚蠢。我不想保持以下示例中a的原始副本不受影响。还有其他办法吗?

import numpy as np
a=np.arange(9).reshape((3,3))
b=np.arange(3)
print a 
print b
print a+np.vstack((np.zeros(3),b,np.zeros(3))).T

输出:

[[0 1 2]
 [3 4 5]
 [6 7 8]]
[0 1 2]
[[ 0.  1.  2.]
 [ 3.  5.  5.]
 [ 6.  9.  8.]]

编辑:为了保持它的真实性,我想在单行中执行此操作,因为这是在评估lambda函数时的计算!无论如何,其他解决方案都非常受欢迎。

2 个答案:

答案 0 :(得分:2)

这是你的意思吗?

a[:, 1] += b

print(a)
#array([[0, 1, 2],
#       [3, 5, 5],
#       [6, 9, 8]])

编辑:保持原始数组不变:

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

EDIT2:如果你真的想要一个单行:

a + np.repeat(b, a.shape[1]).reshape(a.shape)*[0,1,0]

答案 1 :(得分:2)

怎么样:

def cadd(arr, slicer, val):
    arr = arr.copy()
    arr[slicer] += val
    return arr

之后:

>>> a
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
>>> cadd(a, np.s_[:, 1], b)
array([[0, 1, 2],
       [3, 5, 5],
       [6, 9, 8]])
>>> cadd(a, np.s_[1, :], b)
array([[0, 1, 2],
       [3, 5, 7],
       [6, 7, 8]])
>>> a
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

我使用np.s_方便地制作多维切片对象。有了足够的诡计,你可能会把它变成一个单线,但为什么呢?