是否有更快的方法来执行此操作?
尺寸为:
proj
:400 x 400
bigproj
:30k x 30k
totalproj
:30k x 30k
ds1
和ds2
(每个形状:6k x 400)是从较大的矩阵(DS1
和DS2
)中提取的矩阵,每个矩阵的形状均为6k x 30k 。 proj
是在ds1
和ds2
上执行的某些功能的结果。 origindex
是DS1
或DS2
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
好像最后一行添加矩阵的时间最长。
请让我知道是否需要更多信息。
答案 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)