如何累积地将多个值添加到python中的特定列?

时间:2016-03-16 15:13:23

标签: python numpy

我想这是一个棘手的问题。我想累积一些值添加到某些特定的列。这是一个例子:

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.所以单独做每个操作真的无法解决问题。任何帮助都会很棒!

1 个答案:

答案 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)将第一个元素递增两次。

现在唯一的问题是我无法确定如何处理多维数组。文档表明它是可能的。