【问题标题】:Using reduce, map or other function to avoid for loops in python使用reduce、map或其他函数来避免python中的for循环
【发布时间】:2016-09-24 23:50:00
【问题描述】:

我有一个程序用于计算距离,然后应用 k-means 算法。我在一个小列表上进行了测试,它运行良好且快速,但是,我的原始列表非常大(> 5000),所以它需要很长时间,我最终终止了运行。我可以使用 outer() 或任何其他并行函数并将其应用于距离函数以使其更快吗? 在我拥有的小集合上:

strings = ['cosine cos', 'cosine', 'cosine???????', 'l1', 'l2', 'manhattan']

其距离3D数组返回如下:

[[[ 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的内置函数。

【问题讨论】:

  • reducemap 不会让这更快。你为什么要做np.array(list(strings))[j] 而不仅仅是strings[j]
  • 另外,Levenshtein.ratio 不是 Python 自带的东西。这个函数是从哪里来的?
  • 这是一个较旧的试验,可以使我的最后一个错误起作用,这不是必需的,它可以是字符串 [j].. 但是什么能让它更快呢??
  • 它来自名为“Levenshtein”的包,所以我应该在一开始就有 import Levenshtein
  • 使用map 并不意味着循环消失。它只是意味着它不在您的代码中。这里没有魔术。

标签: python functional-programming outer-join levenshtein-distance


【解决方案1】:
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

这里mapreduce 没有任何好处,循环需要像@user2357112 提到的那样运行,但是,这更干净并且应该运行得更快,因为它避免了您一直使用的np.array(list(strings))

【讨论】:

  • 谢谢。这使它更快。当集群操作到来时仍然很慢。
猜你喜欢
  • 2019-02-18
  • 1970-01-01
  • 2023-03-27
  • 2017-08-27
  • 2017-11-11
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多