Самый быстрый способ конвертировать набор трехмерных точек в изображение высот в Python - PullRequest
0 голосов
/ 21 июня 2019

Я пытаюсь преобразовать набор трехмерных точек в карту высот (2-мерное изображение, которое показывает наибольшее смещение точек от пола)

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

import numpy as np

heightmap_resolution = 0.02

# generate some random 3D points
points =  np.array([[x,y,z] for x in np.random.uniform(0,2,100) for y in np.random.uniform(0,2,100) for z in np.random.uniform(0,2,100)])


heightmap = np.zeros((int(np.max(points[:,1])/heightmap_resolution) + 1,
                  int(np.max(points[:,0])/heightmap_resolution) + 1))

for point in points:
    y = int(point[1]/heightmap_resolution)
    x = int(point[0]/heightmap_resolution)
    if point[2] > heightmap[y][x]:
        heightmap[y][x] = point[2]

Интересно, есть ли лучший способ сделать это? Любые улучшения приветствуются!

1 Ответ

1 голос
/ 21 июня 2019

Интуиция: Если вы обнаружите, что используете цикл for с numpy, вам, вероятно, нужно еще раз проверить, есть ли для numpy операция.Я видел, что вы хотели сравнить элементы, чтобы получить максимум, и я не был уверен, что структура была не важна, поэтому я изменил ее.использовать.Попробуйте использовать словарь с кортежем (x, y) в качестве ключа или this (фрейм данных)

import numpy as np
import pandas as pd

heightmap_resolution = 0.02

# generate some random 3D points
points =  np.array([[x,y,z] for x in np.random.uniform(0,2,100) for y in np.random.uniform(0,2,100) for z in np.random.uniform(0,2,100)])
points_df = pd.DataFrame(points, columns = ['x','y','z'])
#didn't know if you wanted to keep the x and y columns so I made new ones.
points_df['x_normalized'] = (points_df['x']/heightmap_resolution).astype(int)
points_df['y_normalized'] = (points_df['y']/heightmap_resolution).astype(int)
points_df.groupby(['x_normalized','y_normalized'])['z'].max()
...