【问题标题】:Faster way of replacing bigger matrix values with smaller matrix values given indices?用给定索引的较小矩阵值替换较大矩阵值的更快方法?
【发布时间】:2019-06-01 01:59:03
【问题描述】:

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

尺寸是:

  • 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

似乎添加矩阵的最后一行花费的时间最长。

如果需要更多信息,请告诉我。

【问题讨论】:

  • 您的意思是对循环的每次 迭代执行full 矩阵bigproj 的求和吗?这会通过proj 累积先前设置的值。还是您的意思是改用totalproj[origindex[m], origindex[n]] += bigproj[origindex[m], origindex[n]]

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


【解决方案1】:

您可以通过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)

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-25
      • 1970-01-01
      相关资源
      最近更新 更多