通过python中的索引将矩阵a中的行添加到矩阵b

时间:2021-05-20 20:53:32

标签: python numpy matrix vectorization

我正在尝试以更有效(矢量化)的方式而不是循环方式进行以下计算。

for i in range(N):

  y[:,idx[i]] -= X[i]

哪里:

  • X 是 N × D 矩阵,
  • y 是 k × D 矩阵
  • idx 是一个长度为 N 的向量,其值介于 0 和 k-1 之间

示例:

x = array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15],
       [16, 17, 18, 19]])


y =  array([[100, 101, 102, 103],
           [104, 105, 106, 107],
           [108, 109, 110, 111]])

idx = array([2, 1, 1, 1, 2])

所以输出应该是:

y = array([[100, 101, 102, 103],
          [ 80,  78,  76,  74],
          [ 92,  91,  90,  89]])

这相当于:

>>> for i in range(5):
...     y[idx[i],:] -= x[i]

1 个答案:

答案 0 :(得分:0)

Pandas 解决方案是最短的。你可以通过 NumPy 来完成,但代码有点长:

import pandas as pd
df = pd.DataFrame(x, idx)
s = df.groupby(df.index).sum()
y[s.index] -= s

或者在您的情况下,由于索引是索引,您可以直接使用:

df = pd.DataFrame(x)
s = df.groupby(idx).sum()
y[s.index] -= s

输出:

array([[100, 101, 102, 103],
       [ 80,  78,  76,  74],
       [ 92,  91,  90,  89]])
相关问题