【问题标题】:Extending dtypes? Best data structure for lists and relations?扩展数据类型?列表和关系的最佳数据结构?
【发布时间】:2012-02-21 11:36:54
【问题描述】:

我正在尝试将由(四面体)单元、它们的(三角形)面、边和节点组成的非结构化网格拟合到既直观又高效的 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 = ...

并在必要时填写它们。不过,这似乎不是很地道。例如,在需要节点、面和边的单元格上循环,每次都需要压缩三个数组。

有用的建议,有人吗?

【问题讨论】:

  • 当您说“假设我稍后决定要添加[字段]”时,您担心的究竟是什么?将字段添加到 cells_dtype 时,难以修改现有代码以匹配?转换以前以旧格式序列化的数据有困难吗?在同一个程序中对单元格数据使用两种不同的 dtype 有困难吗?
  • 哦,我的意思是我现在不知道如何有效地添加字段。我当然可以继续创建一个具有扩展 dtype 的全新数组,然后一点一点地填充旧条目,但这似乎效率低下。
  • 我还是不太明白你所说的“效率”是什么意思。您是在谈论在运行时执行此操作,并且担心复制数组的 CPU 和内存成本,还是您在谈论编辑充满数字的源文件而担心编辑所需的时间每次更改存储结构时它们?或者您最感兴趣的是如何编写其余代码,以便在以后添加或删除字段时尽量减少需要更改的代码量?
  • 现在我理解了这个误解:我的意思不是“以后的生活”,而是“以后的运行时间”。该结构通常仅使用节点和单元创建,并且可以根据需要添加边/面。例如,我担心将边缘/面部信息添加到现有单元阵列的内存和 CPU 成本。

标签: python arrays numpy user-defined-types


【解决方案1】:

首先,我要说我并不是一个真正的 numpy 专家。我认为虽然可能无法按照您的描述进行操作,但问题可能没有您想象的那么大。

正如您所描述的,您希望添加字段,但希望避免移动数据。我认为那是不可能的。您的选择是:

  1. 也许您提前知道哪些网格需要额外的字段?如果是这样,您可以预先分配它们并仔细编写算法以忽略它们不需要操作的字段,以便无论数组中存在哪些额外字段都可以使用它们。

  2. 只需对所有单元格使用相同的 dtype,并在不使用字段时忽略它们。浪费一些内存,但很容易。如果可能的话,

  3. 当您需要添加字段时,使用不同的 dtype 重新分配。虽然这涉及复制,但您是否经常这样做,以至于复制成本成为问题?复制 numpy 数组非常快,当然与 Python 对相同数据的“for”循环相比。

  4. 按照您的建议,为每个字段保留单独的简单数组。虽然这可能涉及压缩基于 Python 的循环,但大概这不是您对它们执行的主要处理类型,是吗?如果主要在 Python for 循环中循环遍历 numpy 数组,您可能不会从 numpy 中获得很多好处。

【讨论】:

    猜你喜欢
    • 2021-12-25
    • 2017-09-26
    • 2018-06-08
    • 1970-01-01
    • 2020-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多