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