#python #dataframe
Вопрос:
Я занимаюсь Python
проектом и пытаюсь сократить некоторое вычислительное время при начале использования Pandas
. В настоящее время код является:
for c1 in centres1:
for c2 in centres2:
if ((c1[0]-c2[0])**2 (c1[1]-c2[1])**2) < search_rad*search_rad:
possible_commet.append([c1,c2])
Я пытаюсь поместить centres1
и centres2
в рамки данных, а затем сравнить каждое значение друг с другом. Помогут ли панды мне сократить это время? (в настоящее 2 mins
время ). Если нет, то как я мог бы обойти это?
Спасибо
Комментарии:
1. Существует ли особая необходимость во вложенном цикле? Похоже, ты ищешь
zip()
Ответ №1:
К сожалению, это никогда не будет быстрым, так как вы собираетесь выполнять n операций в квадрате. Например, если вы сравниваете n
объекты, где n = 1000
у вас есть только 1 миллион сравнений. Если, однако, у вас есть n = 10_000
, то у вас 100 миллионов сравнений. Проблема, увеличенная в 10 раз, становится в 100 раз медленнее.
тем не менее, для циклов в python это относительно дорого. Использование такой библиотеки, как pandas, может означать, что вы можете выполнить только один вызов функции и сократите время. Без каких-либо входных данных трудно оказать дальнейшую помощь, но ниже должны быть приведены некоторые строительные блоки
import pandas
df1 = pandas.Dataframe(centres1)
df2 = pandas.Dataframe(centres2)
df3 = df1.merge(df2, how = 'cross')
df3['combined_centre'] = ((df3['0_x']-df2['0_y']**2 (df1['1_x']-df['1_y'])**2)
df3[df3['prod'] > search_rad**2
Ответ №2:
Да, конечно, панды помогут сократить по крайней мере некоторое время, которое будет меньше того, что вы получаете прямо сейчас, но вы можете попробовать это:
for i,j in zip(center1, center2):
if ((c1[0]-c2[0])**2 (c1[1]-c2[1])**2) < search_rad*search_rad:
possible_commet.append([c1,c2])
Комментарии:
1. Это уже намного быстрее, большое спасибо 🙂
2. привет, поэтому я попытался реализовать его, и в итоге он отклонил множество моих баллов, в частности те, которые указаны ниже 500 x
3. Я не думаю
zip
, что это сработало бы здесь, так как из того, что я понимаю из вопроса, они ищут все возможные перестановки, а не просто первую запись из каждого списка