【问题标题】:How to efficiently get the sub matrix indexed by another matrix?如何有效地获取由另一个矩阵索引的子矩阵?
【发布时间】:2017-02-13 11:21:54
【问题描述】:

现在我有一个矩阵:test_projs,还有一个索引矩阵,GT_index

GT_index 每一行的每个元素表示该行需要的元素在test_projs 中的索引。现在我想计算选择区域上每一行的总和。

一个简单的例子:

test_projs = pd.DataFrame({0:[1,2,3], 1:[4,5,6], 2:[7,8,9], 3:[1,3,5]}, index=[3,4,5])
GT_index = pd.DataFrame({0:[3,2,1], 1:[2,3,2], 2:[1,1,3]}, index=[3,4,5])
b = np.zeros(3)
i = 0
for (index1, row1),(index2,row2) in zip(test_projs.iterrows(),GT_index.iterrows()) :
    b[i]=row1[row2].values.sum()
    i+=1
b

上面例子的结果是:

但它很慢。你知道如何提高它的效率吗?

【问题讨论】:

  • 我正在删除“matlab”标签,因为该问题与 MATLAB 无关。
  • 您的代码对我不起作用。您是否可以使用像 test_projs = pd.DataFrame({0:[1,2,3], 1:[4,5,6], 2:[7,8,9], 3:[1,3,5]}, index=[3,4,5]) 这样的小型 DataFrame 并添加所需的输出?
  • @jezrael 是的,我会给出例子。

标签: performance pandas numpy matrix


【解决方案1】:

这是一种使用 NumPy 数组和 fancy-indexing 技术的方法 -

arr1 = test_projs.values
arr2 = GT_index.values
out = arr1[np.arange(arr2.shape[0]),arr2.T].sum(0)

【讨论】:

  • 非常感谢!!在我的机器上,你的解决方案比我的快 10 倍!
猜你喜欢
  • 1970-01-01
  • 2017-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-12
  • 1970-01-01
  • 1970-01-01
  • 2016-11-17
相关资源
最近更新 更多