#python #arrays
#python #массивы
Вопрос:
У меня есть два массива координат из двух отдельных файлов из расчета CFD. Один из них представляет собой файл сетки, который содержит информацию о подключении, а другой — файл результатов.
Моя проблема в том, что координаты из каждого файла не в том же порядке. Что я хотел бы иметь возможность сделать, так это упорядочить ВСЕ массивы из файла результатов в том же порядке, что и файл сетки.
Моя идея состояла бы в том, чтобы найти совпадающие значения координат xyz и создать отображение таким образом, чтобы можно было упорядочить остальные результирующие массивы.
Я думал о чем-то вроде:
mapping = np.empty(len(co_mesh))
for i,coord in enumerate(co_mesh):
for j in range(len(co_res)):
if (coord[0]==co_res[j,0]) and (coord[1]==co_res[j,1]) and (coord[2]==co_res[j,2]):
mapping[i] = j
где co_mesh, co_res — это массивы, содержащие координаты x, y, z.
Проблема в том, что я подозреваю, что этот цикл займет много времени. На данный момент я перебираю только около 70000 точек, но в будущем это может увеличиться до 1 миллиона или более.
Есть ли более быстрый способ написать это на Python.
Я использую Python 2.6.5.
Ben
Для тех, кто заинтересован, это то, что я сейчас использую:
mesh_coords = zip(xm_list,ym_list,zm_list,range(len(x_po)))
res_coords = zip(xr_list,yr_list,zr_list,range(len(x)))
mesh_coords = sorted(mesh_coords , key = lambda x:(x[0],x[1],x[2]))
res_coords = sorted(res_coords , key = lambda x:(x[0],x[1],x[2]))
mapping = zip(np.array(listym)[:,-1],np.array(listyr)[:,-1])
mapping = sorted(mapping , key = lambda x:(x[0]))
Комментарии:
1. Вы смотрели на интерполяционные функции Scipy? docs.scipy.org/doc/scipy/reference/interpolate.html
Ответ №1:
Как насчет сортировки координатных векторов в обоих файлах по x, чем по y и наименьшей координате z?
Вы можете сделать это эффективно и быстро, если используете массивы numpy для векторов.
Обновить:
Если у вас нет идентификаторов узлов узлов в результирующей сетке. Но координаты те же. Выполните следующие действия:
Добавьте нумерацию в качестве дополнительной информации к вашим векторам. Сортировка обеих сеток по x, y, z добавьте несортированную нумерацию вашей сетки в свой comesh и отсортируйте comesh по этой оси. Теперь comesh содержит точный порядок, как и исходная сетка.
Комментарии:
1. Я рассмотрел это, но также важно поддерживать порядок в массивах подключений. Например, у меня есть массив, который содержит точки, составляющие вершины ячейки (в данном случае куба), в нем задействовано около 40000 ячеек. Затем необходимо соответствующим образом отобразить количество вершин в каждом из массивов связности.
2. Это выглядит хорошо, мне просто нужно разобраться с сортировкой xyz, тогда я думаю, что у меня это получилось. Спасибо
3. Если возможно, попробуйте сохранить свою сетку co с идентификаторами узлов. Несмотря на то, что сортировка работает нормально, наличие идентификаторов узлов значительно упрощает жизнь.
4. Что я пытаюсь использовать np.lexsort с массивом с добавленным столбцом индекса. Похоже, что Lexsort не сортирует должным образом, хотя это неправильно в 12-м десятичном пространстве
5. lexsort не изменяет координаты. 12-й десятичный знак, скорее всего, является некоторой ошибкой представления при чтении недвоичных чисел и преобразовании строки обратно в double.