我想这是一个棘手的问题。我想累积一些值添加到某些特定的列。这是一个例子:
import numpy as np
A = np.random.rand(4,4)
B = np.random.rand(4,4)
[OUT]: A = array([[ 0.46472458, 0.00841153, 0.45631818, 0.42635626],
[ 0.37378943, 0.92900513, 0.47074237, 0.1790853 ],
[ 0.44455962, 0.38604916, 0.52130988, 0.17871398],
[ 0.74742154, 0.48381281, 0.25203475, 0.724025 ]])
[OUT]: B = array([[ 0.78213532, 0.31560444, 0.45251978, 0.19675709],
[ 0.06217241, 0.10009086, 0.65308642, 0.95227678],
[ 0.65643604, 0.20249389, 0.86545423, 0.62765881],
[ 0.61317907, 0.1636594 , 0.28260492, 0.23835911]])
现在我想将B的第二行和第三行添加到A的第一列,并将第三行B添加到A的第二列。天真地尝试了这个:
idx_col = np.array([0,0,1])
idx_row = np.array([1,2,2])
A[:, idx_col] += B[idx_row, :].T
但它没有给我我想要的结果。问题是python只将第三行添加到第一列,并完全忽略第一行到第一列。
[OUT]: array([[ 1.12116062, 0.66484757, 0.45631818, 0.42635626],
[ 0.57628332, 1.13149902, 0.47074237, 0.1790853 ],
[ 1.31001385, 1.25150339, 0.52130988, 0.17871398],
[ 1.37508035, 1.11147162, 0.25203475, 0.724025 ]])
我意识到我可以用一个for循环来做这个,但问题是我正在做一个赋值,它要求代码完全向量化(我知道,这非常令人恼火)。另外,这是一个玩具示例,我实际实现的是,A是500乘10,B是500乘500而idx_col的长度是100.所以单独做每个操作真的无法解决问题。任何帮助都会很棒!
答案 0 :(得分:1)
我不确定你是否需要这个更通用,如果你只有3个操作,为什么不给它们自己的行。
A[:,0] += B[1,:]
A[:,0] += B[2,:]
A[:,1] += B[2,:]
如果您需要在一行中执行此操作,numpy function np.add.to
看起来就像您想要的那样。描述如下
对元素的操作数'a'执行无缓冲的就地操作 由'indices'指定。对于add ufunc,此方法是等效的 到[indices] + = b,除了为元素累积结果 被索引不止一次。例如,只有[[0,0]] + = 1 因缓冲而增加第一个元素,而 add.at(a,[0,0],1)将第一个元素递增两次。
现在唯一的问题是我无法确定如何处理多维数组。文档表明它是可能的。