【发布时间】:2017-06-07 15:26:57
【问题描述】:
我有一个大小为 (d,N) 的矩阵 X。换句话说,有 N 个向量,每个向量都有 d 维。例如,
X = [[1,2,3,4],[5,6,7,8]]
有 N=4 个 d=2 维的向量。
另外,我有 rag 数组(列表列表)。索引是 X 矩阵中的索引列。例如,
I = [ [0,1], [1,2,3] ]
I[0]=[0,1] 索引矩阵 X 中的第 0 列和第 1 列。类似地,元素 I[1] 索引第 1,2 和 3 列。请注意,I 的元素是不属于一样长!
我想做的是使用 I 中的每个元素对矩阵 X 中的列进行索引,对向量求和并得到一个向量。对 I 的每个元素重复此操作,从而构建一个新矩阵 Y。矩阵 Y 应具有与 I 数组中的元素一样多的 d 维向量。在我的示例中,Y 矩阵将有 2 个二维向量。
在我的示例中,元素 I[0] 告诉从矩阵 X 中获取第 0 列和第 1 列。将矩阵 X 的两个向量二维向量相加,并将此向量放入 Y(第 0 列)。然后,元素 I[1] 告诉对矩阵 X 的第 1,2 和 3 列求和,并将这个新向量放入 Y(第 1 列)。
我可以使用循环轻松完成此操作,但如果可能的话,我想将此操作矢量化。我的矩阵 X 有数十万列,而 I 索引矩阵有数万个元素(每个元素都是一个简短的索引列表)。
我的循环代码:
Y = np.zeros( (d,len(I)) )
for i,idx in enumerate(I):
Y[:,i] = np.sum( X[:,idx], axis=1 )
【问题讨论】:
-
如果你实现了分享你的循环代码?
-
@Divakar 添加了我的循环代码
标签: python performance numpy vectorization