我正在尝试以更有效(矢量化)的方式而不是循环方式进行以下计算。
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]
答案 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]])