-3

我对python很陌生,我不知道如何解决这个问题。我有一个包含很多 X、Y、Z 坐标的数组,我需要创建一个输出文件来将它们导入 exel。

我导入了一个 STL 文件并从该文件中创建了一个 2D 数组

现在数组是这样的:

example = [[X1,Y1,Z1],[X1,Y2,Z2],[X2,Y1,Z3],[X2,Y2,Z4]]

X 和 Y 坐标重复很多,z 总是不同的。

我需要做的是使用此布局对它们进行排序,以将其保存到 .csv 文件中:

example, Y1, Y2
X1, Z1, Z2
X2, Z3, Z4

所以将 X 坐标作为行,Y 列和 Z 在其相应的位置可以帮助我吗?提前非常感谢。

4

1 回答 1

0

您可以将此问题分解为以下步骤:

  1. 获取所有唯一的 x 和 y 坐标
  2. 构建适当大小的表/矩阵
  3. 沿上边缘和左边缘分配x和坐标y
  4. 遍历数组,抓取坐标,根据其和坐标z映射到矩阵中正确的位置xy
  5. 将生成的矩阵输出为 csv 文件。

我做出以下假设:

  1. 如果给定x, y, z坐标在数组中不存在,但在矩阵中有可用空间,则矩阵中的对应点将具有值“0”
  2. 数组中没有重复的坐标。

鉴于这些假设,下面的程序应该大致做我认为你想要的。

def find_x_and_y(array):
    '''Step 1: Get unique x and y coordinates, 
    and the width and height of the matrix'''
    x = sorted(list(set([i[0] for i in array])))
    y = sorted(list(set([i[1] for i in array])))

    width = len(x) + 1
    height = len(y) + 1

    return x, y, width, height

def construct_initial_matrix(array):
    '''Step 2: Make the initial matrix (filled with zeros)'''
    x, y, width, height = find_x_and_y(array)

    matrix = []
    for i in range(height):
        matrix.append([0] * width)

    return matrix

def add_edging(array, matrix):
    '''Step 3: Add the x and y coordinates to the edges'''
    x, y, width, height = find_x_and_y(array)

    for coord, position in zip(x, range(1, height)):
        matrix[position][0] = coord

    for coord, position in zip(y, range(1, width)):
        matrix[0][position] = coord

    return matrix

def add_z_coordinates(array, matrix):
    '''Step 4: Map the coordinates in the array to the position
    in the matrix'''
    x, y, width, height = find_x_and_y(array)

    x_to_pos = dict(zip(x, range(1, height)))
    y_to_pos = dict(zip(y, range(1, width)))

    for x, y, z in array:
        matrix[x_to_pos[x]][y_to_pos[y]] = z
    return matrix

def make_csv(matrix):
    '''Step 5: Pretty-printing'''
    return '\n'.join(', '.join(str(i) for i in row) for row in matrix)

def main():
    #example = [[1, 1, 10], [1, 2, 11], [2, 1, 12], [2, 2, 13]]
    example = [[1000,250,12.2],[1000,500,10],[2000,250,15],[2000,500,13.5]]

    matrix = construct_initial_matrix(example)
    matrix = add_edging(example, matrix)
    matrix = add_z_coordinates(example, matrix)

    print make_csv(matrix)

main()
于 2013-08-28T16:28:37.923 回答