【问题标题】:Ways of speeding up a loop that iterates over a large array加速遍历大型数组的循环的方法
【发布时间】:2021-11-27 18:08:30
【问题描述】:

我希望加快下面的代码,该代码循环遍历 brain 中已拆分为区域(编号为 0 到 50)的每个体素,并使用相应的值重新分配该区域(在数组 @987654322 中找到) @ 其中包含 51 个数字)。 brain 是一个 numpy.ndarray。由于大脑阵列的尺寸为 182x218x182,因此完成此循环大约需要 12 秒。

import numpy as np

# Sample data
brain = np.random.randint(10, size=(6,5,5))
region_vals = np.random.randint(250, size=11)

# Iterate through each voxel in the brain
for x in range(0, brain.shape[0]):
    for y in range(0, brain.shape[1]):
        for z in range(0, brain.shape[2]):

            region = brain[x][y][z]  # Get region number

            # Reassign voxel value
            brain[x][y][z] = region_vals[region]

这里不能选择多线程,因为我已经在并行运行此代码。

有没有办法加快循环或完全消除循环?

【问题讨论】:

  • @BobtheMagicMoose 是的,你是对的。移除这些部件将运行时间从 12 秒减少到 0.1 秒。
  • 抱歉,我删除了我的评论 - 我会放回去:我敢打赌,中间的关键部分是瓶颈,而不是循环开销。
  • Numpy 数组适用于批量操作,not 迭代和索引。理想情况下,使用本机 numpy 操作。但是,如果不知道 region_vals[region] 实际在做什么,我们就不能真正说出如何做到最好。
  • @MisterMiyagi region_vals 是一个包含 51 个浮点值的数组,而 region 是一个整数。 region_vals[region] 只是找到该区域的值。
  • @tdelaney 我提供了一些示例数据。

标签: python numpy multidimensional-array indexing


【解决方案1】:

如果region_vals 也是一个 numpy 数组,我相信您可以在单行中使用 brain(初始值)作为 region_vals 的索引: brain = region_vals[brain]

【讨论】:

  • 需要注意的是 1) region_vals 需要是一个 numpy 数组,2) brain 需要是一个 ints 的 numpy 数组,以及 3) 这会创建一个新数组而不是而不是就地修改。 . . .这真是太棒了。
  • 是的,这完全符合@FrankYellin 给出的警告。特别是警告一和二是让我绊倒并阻止它在过去在我的代码中工作的原因。谢谢!
猜你喜欢
  • 2023-01-28
  • 2016-07-15
  • 2015-05-19
  • 1970-01-01
  • 2013-12-12
  • 2017-08-21
  • 2019-08-11
  • 1970-01-01
  • 2013-11-06
相关资源
最近更新 更多