Расширение dtypes?Лучшая структура данных для списков и отношений? - PullRequest
2 голосов
/ 21 февраля 2012

Я пытаюсь поместить неструктурированную сетку, состоящую из (тетраэдрических) ячеек, их (треугольных) граней, ребер и узлов, в структуру данных Python, которая является одновременно интуитивно понятной и эффективной. Вопросы, на которые структура данных должна уметь отвечать: «Каковы координаты узла k?», «Какие ребра находятся в ячейке j?», «Какие ячейки примыкают к грани i?» и пр.

Мое первое предположение состояло в следующем:

nodes_coords = np.array(num_nodes, dtype=np.dtype((float,3)))
cells_dtype = np.dtype([('nodes', (int,4))])
cells = np.array(num_cells, dtype=cells_dtype)

и пр. Преимущество этого состоит в том, что существует очень интуитивный способ получения отношений ячейка-узел, а именно

cells[4]['nodes']

даст вам узлы в ячейке # 4.

Есть один недостаток, который я сейчас вижу: Массивы не являются расширяемыми. Предположим, что позже я решу во время выполнения добавить информацию о гранях и ребрах; Как я могу добавить поля в массив ячеек, не перемещаясь вокруг данных, то есть, как динамически расширять dtypes массивов?

Обходным путем будет создание отдельных массивов, таких как

cells_nodes = ...
cells_faces = ...
cells_edges = ...

и заполните их при необходимости. Это не кажется идиоматичным, хотя. Например, для циклического обхода ячеек, в которых требуются узлы, грани и ребра, каждый раз требуется сжать три массива.

Полезные предложения, кто-нибудь?

1 Ответ

0 голосов
/ 22 февраля 2012

Прежде всего, я скажу, что я не совсем тупой эксперт.Я думаю, что, хотя, вероятно, нет способа сделать то, что вы описываете, это, вероятно, не такая большая проблема, как вы думаете.

Когда вы описываете это, вы хотите добавить поля, но вы хотите избежать перемещения данных,Я думаю, что это просто невозможно.Возможны следующие варианты:

  1. Возможно, вы заранее знаете, для каких сеток понадобятся дополнительные поля?Если это так, вы можете выделить их заранее и тщательно написать свои алгоритмы, чтобы игнорировать поля, которыми они не должны манипулировать, чтобы их можно было использовать независимо от того, какие дополнительные поля существуют в массиве.

  2. Просто используйте один и тот же тип d для всех ячеек и игнорируйте поля, когда они не используются.Трата памяти, но довольно легко.Если возможно,

  3. Перераспределите с другим dtype, когда вам нужно добавить поле.Хотя это включает в себя копирование, делаете ли вы это достаточно часто, чтобы стоимость копии была проблемой?Копирование пустых массивов выполняется довольно быстро, по сравнению с циклами Python for для этих же данных.

  4. Как вы предлагаете, сохраняйте отдельные простые массивы для каждого поля.Хотя это может включать в себя архивирование для циклов на основе Python, по-видимому, это не основной вид обработки, которую вы выполняете для них, не так ли?Если в петлях Python for в основном циклы перебираются с массивами numpy, вы, вероятно, не получите много пользы от numpy.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...