使用numpy并行初始化矩阵

ogq8wdun  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(145)

我有一个矩阵的每个元素的方程。假设a_i,j = i + j。
有没有一种方法可以使用numpy为我的矩阵并行初始化一个numpy数组,或者我必须使用线程/其他并行化技术?这些元素彼此独立。

aor9mmx1

aor9mmx11#

如果你真的想并行化这个矩阵的初始化和其他操作,看看Numba。在你的例子中,你可以写类似这样的东西

import numba as nb
import numpy as np

N = 100

# Initialize memory
a = np.zeros((N,N), dtype=np.int64)

@nb.njit('void(int64[:,::1])', parallel=True, cache=True) #
def initialize_array (a):
    for i in nb.prange(a.shape[0]):
        for j in nb.prange(a.shape[1]):
            a[i,j] = i + j

initialize_array(a)

print(a[4,3]) # 7

这里的prange()表示并行化的循环。但是你也可以只使用普通的python range(),因为Numba循环已经比原始Python循环快得多。但实际上,您应该只使用Numba进行更复杂的操作。如果您的目标只是避免Python for循环速度慢,那么您也可以做如下的事情

import numba as nb
import numpy as np

N = 100

# Initialize memory
i = np.arange(N).reshape(-1,1)
j = np.arange(N).reshape(1,-1)

a = i + j

print(a[3,4]) # 7

请注意,一些numpy操作有时会使用多个线程。一般来说,如果你想快速地使用numpy数组,你必须学会从矩阵/向量操作的Angular 来思考,而不是从for循环的Angular 来思考。希望这有帮助!

相关问题