使用 reduce、map 或其他函数来避免 python 中的循环
Using reduce, map or other function to avoid for loops in python
我有一个程序用于计算距离,然后应用 k-means 算法。我在一个小列表上进行了测试,它运行良好且速度很快,但是,我的原始列表非常大(>5000),所以它花了很长时间,我最终终止了 运行。我可以使用 outer() 或任何其他并行函数并将其应用于距离函数以使其更快吗?
在我拥有的小型设备上:
strings = ['cosine cos', 'cosine', 'cosine???????', 'l1', 'l2', 'manhattan']
和它的距离 3D 数组 returns 像这样:
[[[ 0. 0.25 0.47826087 1. 1. 0.89473684]
[ 0.25 0. 0.36842105 1. 1. 0.86666667]
[ 0.47826087 0.36842105 0. 1. 1. 0.90909091]
[ 1. 1. 1. 0. 0.5 1. ]
[ 1. 1. 1. 0.5 0. 1. ]
[ 0.89473684 0.86666667 0.90909091 1. 1. 0. ]]]
上面数组的每一行代表字符串列表中一项的距离。我使用 for 循环的方法是:
strings = ['cosine cos', 'cosine', 'cosine???????', 'l1', 'l2', 'manhattan']
data1 = []
for j in range(len(np.array(list(strings)))):
for i in range(len(strings)):
data1.append(1-Levenshtein.ratio(np.array(list(strings))[j], np.array(list(strings))[i]))
#n =(map(Levenshtein.ratio, strings))
#n =(reduce(Levenshtein.ratio, strings))
#print(n)
k=len(strings)
data2=np.asarray(data1)
arr_3d = data2.reshape((1,k,k))
print(arr_3d)
其中arr_3d
就是上面的数组。我如何使用 outer() 或 map() 中的任何一个来替换上面的 for 循环,因为当列表 strings
很大时,它会花费数小时甚至从未得到结果。感谢您的帮助。 Levenshtein.ratio 是 python 中的内置函数。
import numpy as np
strings = ['cosine cos', 'cosine', 'cosine???????', 'l1', 'l2', 'manhattan']
k=len(strings)
data = np.zeros((k,k))
for i,string1 in enumerate(strings):
for j,string2 in enumerate(strings):
data[i][j] = 1-Levenshtein.ratio(string1, string2)
print data
这里的 map
或 reduce
没有任何好处,循环需要 运行 正如@user2357112 提到的,但是,这更干净并且应该 运行 更快,因为它避免了您在整个过程中使用的 np.array(list(strings))
。
我有一个程序用于计算距离,然后应用 k-means 算法。我在一个小列表上进行了测试,它运行良好且速度很快,但是,我的原始列表非常大(>5000),所以它花了很长时间,我最终终止了 运行。我可以使用 outer() 或任何其他并行函数并将其应用于距离函数以使其更快吗? 在我拥有的小型设备上:
strings = ['cosine cos', 'cosine', 'cosine???????', 'l1', 'l2', 'manhattan']
和它的距离 3D 数组 returns 像这样:
[[[ 0. 0.25 0.47826087 1. 1. 0.89473684]
[ 0.25 0. 0.36842105 1. 1. 0.86666667]
[ 0.47826087 0.36842105 0. 1. 1. 0.90909091]
[ 1. 1. 1. 0. 0.5 1. ]
[ 1. 1. 1. 0.5 0. 1. ]
[ 0.89473684 0.86666667 0.90909091 1. 1. 0. ]]]
上面数组的每一行代表字符串列表中一项的距离。我使用 for 循环的方法是:
strings = ['cosine cos', 'cosine', 'cosine???????', 'l1', 'l2', 'manhattan']
data1 = []
for j in range(len(np.array(list(strings)))):
for i in range(len(strings)):
data1.append(1-Levenshtein.ratio(np.array(list(strings))[j], np.array(list(strings))[i]))
#n =(map(Levenshtein.ratio, strings))
#n =(reduce(Levenshtein.ratio, strings))
#print(n)
k=len(strings)
data2=np.asarray(data1)
arr_3d = data2.reshape((1,k,k))
print(arr_3d)
其中arr_3d
就是上面的数组。我如何使用 outer() 或 map() 中的任何一个来替换上面的 for 循环,因为当列表 strings
很大时,它会花费数小时甚至从未得到结果。感谢您的帮助。 Levenshtein.ratio 是 python 中的内置函数。
import numpy as np
strings = ['cosine cos', 'cosine', 'cosine???????', 'l1', 'l2', 'manhattan']
k=len(strings)
data = np.zeros((k,k))
for i,string1 in enumerate(strings):
for j,string2 in enumerate(strings):
data[i][j] = 1-Levenshtein.ratio(string1, string2)
print data
这里的 map
或 reduce
没有任何好处,循环需要 运行 正如@user2357112 提到的,但是,这更干净并且应该 运行 更快,因为它避免了您在整个过程中使用的 np.array(list(strings))
。