我对Python和Pandas相当陌生。我在Pandas Datframe中有以下列:
歌曲编号歌曲ID专辑艺术家ID相似艺术家艺术家歌曲热门度响度节奏年份
从artistHotness到年份列的数字数据。因此,我尝试使用以下代码计算歌曲之间的距离/余弦:
t1=time()
m = 1000
mat = np.zeros((m, m))
for i in range(0,m):
for j in range(0,m):
if i != j:
mat[i][j] = euclidean(data.ix[i,5:], data.ix[j,5:])
'''if data.ix[i,2] == data.ix[j,2]:
mat[i][j] += 1
if data.ix[i,3] == data.ix[j,3]:
mat[i][j] += 1
#l1,l2 - list of similar artists
l1_str = data.ix[i,4].strip(']')[1:]
l2_str = data.ix[j,4].strip(']')[1:]
l1 = l1_str.split()
l2 = l2_str.split()
common = len(set(l1).intersection(l2))
mat[i][j] += common
mat[i][j] /= 3'''
else:
mat[i][j] = 0.0
t2 =time()
print(t2-t1)
所以这基本上需要循环10^4*10^4次。如果我对m=1000执行此操作,我将在2249秒或37.48分钟内得到结果,因此我无法及时得到m=10000的结果。
如何加快速度(通过避免循环?panda函数)?
感谢的帮助
您可以通过使用scikit learn中的euclidean_distances
函数来避免使用循环。
from sklearn.metrics.pairwise import euclidean_distances
import numpy as np
mat = np.random.rand(5, 5)
pairwise_dist_mat = euclidean_distances(mat)
pairwise_dist_mat
array([[ 0. , 1.19602663, 1.08341967, 1.07792121, 1.1245057 ],
[ 1.19602663, 0. , 0.52135682, 0.82797734, 0.78247091],
[ 1.08341967, 0.52135682, 0. , 0.87764513, 0.81903634],
[ 1.07792121, 0.82797734, 0.87764513, 0. , 0.1386294 ],
[ 1.1245057 , 0.78247091, 0.81903634, 0.1386294 , 0. ]])