pythonfor循环和程序_解释numpy的矢量化函数应用程序与python的for循环之间的速度差异...

我在一组42000幅图像上实现了一个称为TF-IDF的加权系统,每个图像由784个像素组成。这基本上是一个42000x784矩阵。

我尝试的第一种方法是使用显式循环,花费超过2小时。def tfidf(color,img_pix,img_total):

if img_pix==0:

return 0

else:

return color * np.log(img_total/img_pix)

...

result = np.array([])

for img_vec in data_matrix:

double_vec = zip(img_vec,img_pix_vec)

result_row = np.array([tfidf(x[0],x[1],img_total) for x in double_vec])

try:

result = np.vstack((result,result_row))

# first row will throw a ValueError since vstack accepts rows of same len

except ValueError:

result = result_row

我尝试的第二种方法是使用numpy矩阵,花费的时间不到5分钟。注意,data_matrix、img_pix_mat都是42000×784矩阵,而img_total是标量。result = data_matrix * np.log(np.divide(img_total,img_pix_mat))

我希望有人能解释速度上的巨大差异。

以下题为“NumPy数组:一种高效数值计算结构”(http://arxiv.org/pdf/1102.1523.pdf)的论文的作者在第4页的顶部声明,由于矢量化计算,他们观察到速度增加了500倍。我想我看到的速度增加很大程度上是由于这个原因。然而,我想进一步问一下,为什么numpy矢量化计算比标准python循环快得多?

另外,也许你们知道第一种方法速度慢的其他原因。try/except结构的开销是否很高?或者,为每个循环生成一个新的np.array可能需要很长时间?

谢谢。

可以使用NumpyPython的多线程库进行图像处理的并行化。 首先,将图像加载到Numpy数组中: ```python import numpy as np import cv2 img = cv2.imread('image.jpg') img = np.array(img) ``` 接下来,可以使用Numpy矢量化函数对图像进行处理。例如,下面的代码使用Numpy的multiply函数将图像的每个像素的红色通道值乘以2: ```python def process_image(img): img[:, :, 0] = np.multiply(img[:, :, 0], 2) return img processed_img = process_image(img) ``` 要并行化这个处理过程,可以使用Python的多线程库。下面的代码使用4个线程并行化图像处理: ```python import threading def process_image_thread(img, start_row, end_row): img[start_row:end_row, :, 0] = np.multiply(img[start_row:end_row, :, 0], 2) threads = [] num_threads = 4 rows_per_thread = img.shape[0] // num_threads for i in range(num_threads): start_row = i * rows_per_thread end_row = start_row + rows_per_thread thread = threading.Thread(target=process_image_thread, args=(img, start_row, end_row)) threads.append(thread) thread.start() for thread in threads: thread.join() processed_img = img ``` 在这个例子中,每个线程处理图像的一个垂直切片。每个线程的开始和结束行由图像的总行数和线程数计算得出。每个线程使用process_image_thread函数处理它的切片。最后,所有线程都完成后,将处理后的图像存储在processed_img变量中。 注意,使用多线程并不总是比单线程更快,因为线程切换和同步开销可能会使得并行化变得更慢。因此,需要进行基准测试来确定最佳的线程数和处理方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值