【问题标题】:Parallelize operations for each cell in a numpy array并行化 numpy 数组中每个单元格的操作
【发布时间】:2015-05-18 11:52:29
【问题描述】:

我试图找出对 2D numpy 数组中的每个单元格并行执行单个操作的最佳方法。

特别是,我需要对数组中的每个单元格进行按位运算。

这就是我使用单个 for 循环所做的:

for x in range(M):
    for y in range(N):
        v[x][y] = (v[x][y] >> 7) & 255

我找到了一种使用vectorize 方法执行上述相同操作的方法:

def f(x):
    return (x >> 7) & 255
f = numpy.vectorize(f)

v = f(v)

但是,使用矢量化似乎并没有提高性能。

我在 this answer on StackOverflow 中读到了 numexpr,其中还引用了 TheanoCythonTheano 似乎是一个很好的解决方案,但我找不到适合我的例子。

所以我的问题是:使用并行化和可能的 GPU 计算改进上述代码的最佳方法是什么?有人可以发布一些示例代码吗?

【问题讨论】:

  • 您可以查看multiprocessing.Pool,为您的按位运算定义一个函数并发送所有单元格的列表。然后它将使用你所有的处理器来评估结果,但你需要重建数组,这会让你浪费时间。你的阵列有多大?你的计算需要多长时间?
  • 通过如此简单的元素转换,整体性能可能会受到内存 IO 的限制。即,将数据移入/移出 GPU 可能会使操作总体上变慢。
  • 更正第一段代码中的缩进和变量名。
  • @hpaulj,我刚刚完成,谢谢
  • 索引二维数组的常规方法是v[x,y]。在这里使用[x][y] 可能是等效的,但是如果v[x] 生成的是副本而不是视图,则它不起作用。

标签: python numpy parallel-processing theano


【解决方案1】:

我不熟悉按位运算,但这里给出的结果与您的代码相同,并且是矢量化的。

import numpy as np

# make sure it is a numpy.array
v = np.array(v)

# vectorized computation
N = (v >> 7) & 255

【讨论】:

    猜你喜欢
    • 2018-02-03
    • 1970-01-01
    • 2021-07-15
    • 1970-01-01
    • 2023-04-07
    • 2016-07-14
    • 2017-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多