0

背景:
我有一个非常大的 3D 笛卡尔坐标列表,我需要处理此列表以按其 Z 坐标(即该平面中的所有坐标)对坐标进行分组。目前,我使用循环为每个 Z 坐标从列表中手动创建组,但如果现在有几十个可能的 Z(以前只处理 2-3 个平面)坐标,这将变得不切实际。我当然知道如何根据类似元素对列表进行分组,但我正在寻找一种方法来自动处理 n 个可能的 Z 值的过程。

问题:
自动化对相同 Z 的列表元素进行分组的过程的最有效方法是什么协调然后为每个平面创建一个唯一列表?

代码片段:
我只是使用一个简单的列表推导来对单个平面进行分组:
newlist=[x for x in coordinates_xyz if insert_possible_Z in x]
我正在寻找它来自动为数据集中的每个 Z 平面创建一个新的唯一列表。

数据格式:
((x1,y1,0), (x2, y2, 0), ... (xn, yn, 0), (xn+1,yn+1, 50),(xn+2,yn+2, 50), ... (x2n+1,y2n+1, 100), (x2n+2,y2n+2, 100)...)
我想自动获取 Z=0、Z=50、Z=100 等的所有坐标。注意 Z 的值(增量为 50)只是一个示例,实际数据可以有任何值。

注意:
我的数据是从文件中导入的,或者是由列表中的单独模块生成的。这对于与另一个程序(我没有写过)的接口是必要的。

4

3 回答 3

1

按 Z 对元素进行分组并列出如此分组的元素的最有效方法是不列出。

itertools.groupby进行您想要的分组,而无需创建新列表的开销。

当您不熟悉一般机制时,Python 生成器需要一点时间来适应。官方生成器文档是了解它们为何有用的良好起点。

于 2013-09-26T15:05:15.033 回答
0

如果我正确地解释了这一点,那么您有一组坐标 C = (X,Y,Z),其中包含离散数量的 Z 值。如果是这种情况,为什么不使用字典将坐标列表与关联的 Z 值作为键相关联?

你的数据结构看起来像:

z_ordered = {}
z_ordered[3] = [(x1,y1,z1),(x2,y2,z2),(x3,y3,z3)]

与键关联的每个列表都具有相同的 Z 值。

当然,如果您的 Z 值是连续的,您可能需要对此进行修改,例如通过使键仅与 Z 值相关联的整数,因此您以 1 为增量进行分箱。

于 2013-09-26T14:57:20.020 回答
0

所以这是我想出的简单解决方案:

groups=[]
groups[:]=[]
No_Planes=#Number of planes
dz=#Z spacing variable here

for i in range(No_Planes):
    newlist=[x for x in coordinates_xyz if i*dz in x]
    groups.append(newlist)

这让我可以简单地使用groups[i]. 我也可以操纵我的间距。这也是我现有代码的扩展,正如我在阅读 @msw 关于 itertools 的回复后意识到的那样,循环通过我当前的方法正盯着我看,而且比我想象的要简单得多!

于 2013-09-26T18:29:05.950 回答