gpt4 book ai didi

python-3.x - numpy 矩阵上的并行 for 循环

转载 作者:行者123 更新时间:2023-12-04 15:57:16 32 4
gpt4 key购买 nike

我在看 joblib 示例,但我无法弄清楚如何对矩阵进行并行 for 循环。我正在计算矩阵行之间的成对距离度量。所以我在做:

N, _ = data.shape
upper_triangle = [(i, j) for i in range(N) for j in range(i + 1, N)]
dist_mat = np.zeros((N,N))

for (i, j) in upper_triangle:
dist_mat[i,j] = dist_fun(data[i], data[j])
dist_mat[j,i] = dist_mat[i,j]

哪里 dist_fun接受两个向量并计算距离。自从调用 dist_fun 以来,如何使此循环并行?可以相互独立。

编辑:我使用的距离函数是 fastdtw 这是 不是 很快。所以我想 真的做想要并行化这个。使用:
dist_mat = pdist(data, lambda x,y : fastdtw(x,y, dist=euclidean)[0])

我得到 58.1084 秒的执行时间,并使用:
dist_mat = np.zeros((N,N))
for (i,j), _ in np.ndenumerate(dist_mat):
dist_mat[i,j], _ = fastdtw(data[i,:], timeseries[j,:], dist=euclidean)

我得到 116.36 秒并使用:
upper_triangle = [(i,j) for i in range(N) for j in range(i+1, N)]
dist_mat = np.zeros((N,N))

for (i,j) in upper_triangle:
dist_mat[i,j], _ = fastdtw(data[i,:], data[j,:], dist=euclidean)
dist_mat[j,i] = dist_mat[i,j]

我得到 55.62 秒。这里 N=33 .是否 scipy自动使用所有可用的内核?

编辑:我想我已经找到了使用 multiprocessing 的解决方法包,但我不会回答 的问题joblib 人们在我发布我认为有效的内容之前做出回应。

最佳答案

这可以使用 multiprocessing 如下完成模块:

import numpy as np
from fastdtw import fastdtw
import multiprocessing as mp
from scipy.spatial.distance import squareform, euclidean
from functools import partial

# Create simulated data matrix
data = np.random.random((33,300))

N, _ = data.shape
upper_triangle = [(i,j) for i in range(N) for j in range(i+1, N)]

with mp.Pool(processes=4) as pool:
result = pool.starmap(partial(fastdtw, dist=euclidean), [(data[i], data[j]) for (i,j) in upper_triangle])

dist_mat = squareform([item[0] for item in result])

使用 timeit 的计时结果在 IvyBridge Core-i5 :
24.052 secs

这是没有显式并行化的一半时间。

还有:

作为将来使用 fastdtw 的任何人的引用包裹。从 scipy.spatial.distance 导入距离函数并调用 fastdtw如链接上的示例所示,比仅使用要慢得多: fastdtw(x,y,dist=2) .结果似乎与我相似,使用 pdist 的执行时间(不诉诸并行化)不到一秒钟。

关于python-3.x - numpy 矩阵上的并行 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51350640/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com