【问题标题】:add row from matrix a to matrix b by index in python在python中按索引将矩阵a中的行添加到矩阵b
【发布时间】:2021-08-10 03:29:27
【问题描述】:

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

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]

【问题讨论】:

  • 你能举个简单的例子吗
  • y[:,idx[i]]y[idx[i],:]?
  • 我的意思是给出矩阵分量,例如 if a = [[1,2,3], [4,5,6]] 和 b = [7,8,9] 和 ind = [0 , 1,2] 你想计算或得到什么?

标签: python numpy matrix vectorization


【解决方案1】:

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]])

【讨论】:

  • 看上面我只是更新我的问题以包含一个例子
  • @AryehHoltzberg 请查看帖子上的编辑以包含您要查找的内容。谢谢
  • 看我的例子,我想为每次行号出现在索引向量中时对行进行子结构,因此对于 Y 矩阵中的第 2 行,我将子结构第 1、2、3 行,并将得到 [ 80、78、76、74]
  • @AryehHoltzberg 我明白了。那将扩展 Numpy 的能力。你当然可以为它做矢量化 numpy,但 Pandas 更适合这样的任务(基本上是 Pandas 中的单线)。你可以用熊猫代替吗?如果没有,我可以为它写一个 Numpy 解决方案。
  • 感谢 pandas 会很棒,如果你有 numpy 的解决方案,我很乐意看到只是为了学习
猜你喜欢
  • 2013-04-20
  • 2017-04-20
  • 2017-09-26
  • 1970-01-01
  • 2021-05-11
  • 1970-01-01
  • 2018-10-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多