给定索引的情况下,用较小的矩阵值替换较大的矩阵值的更快方法?

时间:2019-01-05 22:25:52

标签: python python-2.7 numpy for-loop matrix

是否有更快的方法来执行此操作?

尺寸为:

  • proj:400 x 400

  • bigproj:30k x 30k

  • totalproj:30k x 30k

ds1ds2(每个形状:6k x 400)是从较大的矩阵(DS1DS2)中提取的矩阵,每个矩阵的形状均为6k x 30k 。 proj是在ds1ds2上执行的某些功能的结果。 origindexDS1DS2

的列索引
ds1 = DS1[:,origindex]
ds2 = DS2[:,origindex]
proj = somefunction(ds1,ds2)

for m, n in product(range(proj.shape[0]), range(proj.shape[1])):
    bigproj[origindex[m], origindex[n]] = proj[m, n]  
    totalproj += bigproj

好像最后一行添加矩阵的时间最长。

请让我知道是否需要更多信息。

2 个答案:

答案 0 :(得分:0)

如果bigproj和totalproj是列表列表,则默认行为+ =会将一个列表中的所有项目附加到另一个列表中。因此,该循环的每次迭代,totalproj都会增长30000 x 30000个元素。

由于看起来您仅在循环的每次迭代中更改单个元素,所以我希望看看您是否可以将更改单独存储并在循环完成后根据需要添加或扩展矩阵。

答案 1 :(得分:0)

您可以通过np.mgrid矢量化循环的第一部分:

m, n = proj.shape
bigproj[tuple(origindex[np.mgrid[:m, :n]])] = proj

如果您真的打算按照书面形式(totalproj += bigproj执行第二部分,即在每个上添加bigproj当前版本您可以通过以下方式进行迭代:

bigproj[tuple(origindex[np.mgrid[:m, :n]])] = proj * np.arange(1, m*n+1).reshape(m, n)