将xyz值列表放入3d数组中

时间:2014-11-20 13:47:02

标签: python algorithm sorting

我有一个x y和z值列表(每行一个x,y和z值)。这些对应于盒子的长度,宽度和高度。我想找到这个盒子每10平方厘米的平均高度。如果以3d数组格式表示值,这将很容易。但x y和z的行不是有序的。有谁知道这样做的聪明方法?

1 个答案:

答案 0 :(得分:1)

如果你只想这样做一次,你可以循环遍历所有点;

sum, n = 0, 0
with open("xyzFile") as f:
  for line in f:
    x,y,z = [int(element) for element in line.split()]
    if x == 10 and y == 10:
      sum += z
      n += 1

如果您想多次执行此操作,对于xyz的不同值,则需要在速度和内存使用之间进行权衡。

您可以通过重复循环遍历所有值来使用最少的内存 - 这不会存储额外的数据。另一方面,您可以循环浏览一次,并将列表中包含特定xyz值的所有元素存储起来。例如;

xs, ys, zs = {}, {}, {}
cuboids = []
with open("xyzFile") as f:
  for i, line in enumerate(f):
    x,y,z = [int(element) for element in line.pslit()]
    cuboids.append([x,y,z])
    for e, es in zip([x,y,z], [xy,ys,zs]):
      if e in es:
        es[e].append(i)
      else:
        es[e] = [i]

然后,您可以通过x之类的操作获得所有yzxs.keys()长度的集合。

然后,如果你想得到长度x长度为10的所有长方体,那么你可以xs[10]。如果您希望同时使用x == y == 10获取所有长方体,则可以使用sets来获取所有共同条目;

set(xs[10]) & set(ys[10])

所以你可以像这样计算平均值:

sum, n = 0, 0
for i in set(xs[10]) & set(ys[10]):
  sum += cuboids[i][2] #z is the second entry
  n+=1
sum /= float(n) #float important to prevent integer maths.
免责声明:我还没有测试过这个!