我在一组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可能需要很长时间?
谢谢。