Отображение массивов с одинаковыми значениями, но в разных порядках

#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.