我在一组42000张图像上实现了一个称为TF-IDF的加权系统,每个图像包含784个像素.这基本上是42000乘784矩阵.
我尝试的第一种方法是使用显式循环并花费了超过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
Run Code Online (Sandbox Code Playgroud)
我试图使用numpy矩阵的第二种方法花了不到5分钟.请注意,data_matrix,img_pix_mat都是42000 x 784矩阵,而img_total是标量.
result = data_matrix * np.log(np.divide(img_total,img_pix_mat))
Run Code Online (Sandbox Code Playgroud)
我希望有人能解释速度上的巨大差异.
题为"NumPy数组:高效数值计算结构"(http://arxiv.org/pdf/1102.1523.pdf)的以下论文的作者在第4页的最上面指出,他们观察到500倍的速度提升由于矢量化计算.我假设我看到的速度增加很多是由于这个原因.但是,我想更进一步,问为什么numpy矢量化计算比标准python循环快得多?
另外,也许你们可能知道为什么第一种方法很慢的其他原因.尝试/除结构有高开销吗?或者为每个循环形成一个新的np.array需要很长时间?
谢谢.