我想知道为什么这个问题永远不会被其他人提出来(也许它是如此愚蠢但我需要它)而我自己也无法弄明白。我想将一维数组添加到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
函数时的计算!无论如何,其他解决方案都非常受欢迎。
答案 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_
方便地制作多维切片对象。有了足够的诡计,你可能会把它变成一个单线,但为什么呢?