【问题标题】:Efficient way to iterate through numpy arrays in parallel and create a new resultant array并行遍历 numpy 数组并创建新结果数组的有效方法
【发布时间】:2013-05-14 12:48:31
【问题描述】:

我有 3 个 numpy 数组 dm_w, dm_sdm_p。我需要并行遍历这些数组,根据检查条件进行一些计算,如下面的代码所示。

我的代码适用于较小的数组,但对于较大的数组则耗时太长。我需要一种有效且更快的方法来实现这一目标。需要一些专家意见。

我的代码:

prox_mat = []
for w_dist, s_dist, PI in zip(np.nditer(dm_w), np.nditer(dm_s), np.nditer(dm_p)):
    if PI == 0.0:
         proximity_score = ((w_dist + len(np.unique(dm_s) * s_dist)) / 
                           (dm_w.shape[0] * len(np.unique(dm_s))))
         prox_mat.append(proximity_score)
    else:
         proximity_score = ((w_dist + len(np.unique(dm_s) * s_dist)) / 
                           (dm_w.shape[0] * len(np.unique(dm_s)))) * log10(10 * PI)
         prox_mat.append(proximity_score)

ps = np.array(prox_mat)
ps = np.reshape(ps, dm_w.shape)

【问题讨论】:

  • 在我看来,你可以计算 np.unique 一次,而不是每次都通过循环。这可以为您节省大量时间,而无需并行化。

标签: python arrays python-2.7 numpy python-3.x


【解决方案1】:

几件事。一,np.unique(dm_s) 的计算应该被拉到循环之外。更进一步,它看起来像:

len(np.unique(dm_s) * s_dist) == len(np.unique(dm_s))

应该退出循环或者是一个错误。无论如何..

我们应该向量化 forloop/append 结构:

dm_s_uniques = len(np.unique(dm_s))
logs = np.log10(10 * dm_p)
logs[logs == -np.inf] = 1
prox_mat = ((dm_w +  dm_s_uniques) / (dm_w.shape[0] * dm_s_uniques)) * logs

ps = np.reshape(ps, dm_w.shape)

看起来我在映射

【讨论】:

  • 搬出 np.unique 确实有点帮助。有没有更好的快速并行迭代方法?由于我处理某些案例的矩阵非常庞大。
  • 你考虑过使用 cython 吗?通过使用 cython,我有时会得到一个快 10 倍的代码。
  • @ArunprasathShankar 这里的“巨大”有多大?
  • @DanielThaagaardAndreasen 矢量化它(如上)应该与 cython 大致相同。如果这仍然不够快,并行化应该让它的速度与他的机器一样快。
  • @ArunprasathShankar Numpy 为向量操作提供了高效的例程。如果我有一个 np.array a,那么 3*a 比 np.array([3*i for i in a]) 快得多。因此,这里给出的代码与 Cython 中的代码一样快,而且工作量更少。由于我们也可以零碎地进行计算,因此下一步将是并行化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-17
  • 2021-11-28
  • 2015-07-31
  • 2016-05-13
相关资源
最近更新 更多