Numpy: Как мне создать сетку внутри коробки? - PullRequest
2 голосов
/ 28 апреля 2020

У меня есть кубоид со всеми его восемью угловыми координатами вершины

(-111.2433, -70.9316, -26.2690)
(-111.2433, -70.9316, 80.8608)
(-111.2433, 71.5288, 80.8608)
(103.3007, 71.5288, -26.2690)
(103.3007, -70.9316, -26.2690)
(103.3007, -70.9316, 80.8608)
(103.3007, 71.5288, 80.8608)

Я хочу создать трехмерные вокселы в этом объеме объемом 1м x 1м x 1м и сохранить их координаты центра. Я попытался использовать np.meshgrid() для этого следующим образом.

x_max = -1000000 
y_max = -1000000 
z_max = -10000000
x_min = 1000000 
z_min = 1000000 
y_min = 10000000 
for v in vertices:
    x = v[0] 
    y = v[1]
    z = v[2]
    x_max = max(x_max  ,x)
    x_min = min(x_min , x)
    y_max = max(y_max  ,y)
    y_min = min(y_min , y)
    z_max = max(z_max  ,z)
    z_min = min(z_min , z)
xdim = list(range(int(x_min) , int(x_max) , 1))
ydim =list(range(int(y_min) , int(y_max) , 1))
zdim =list(range(int(z_min) , int(z_max) , 1))
grid  = np.array(np.meshgrid(xdim , ydim , zdim)).T.reshape(3 , -1)

xdim, ydim, zdim - списки, состоящие из всех координат, которые l ie в измерении блока- мудрый и np.mehsgrid() в основном берет декартово произведение всех этих координат, давая нам, следовательно, (x , y, z) координаты всех воксельных центров, что выглядит примерно так:

array([[-111,  -70,  -26],
       [-111,  -64,  -26],
       [-111,  -57,  -26],
       ...,
       [ 103,   55,   80],
       [ 103,   62,   80],
       [ 103,   71,   80]])

Я думаю, что моя реализация может быть неэффективно, поэтому любая помощь будет полезна!

1 Ответ

1 голос
/ 28 апреля 2020

Если вы преобразуете вершины в массив numpy типа int64, это может быть значительно упрощено:

def mgOriginal():
    vertices = [(-111.2433, 71.5288, -26.2690),(-111.2433, -70.9316, -26.2690),(-111.2433, -70.9316, 80.8608),(-111.2433, 71.5288, 80.8608),(103.3007, 71.5288, -26.2690),(103.3007, -70.9316, -26.2690),(103.3007, -70.9316, 80.8608),(103.3007, 71.5288, 80.8608)]
    x_max = -1000000 
    y_max = -1000000 
    z_max = -10000000
    x_min = 1000000 
    z_min = 1000000 
    y_min = 10000000 
    for v in vertices:
        x = v[0] 
        y = v[1]
        z = v[2]
        x_max = max(x_max  ,x)
        x_min = min(x_min , x)
        y_max = max(y_max  ,y)
        y_min = min(y_min , y)
        z_max = max(z_max  ,z)
        z_min = min(z_min , z)

    xdim = list(range(int(x_min) , int(x_max) , 1))
    ydim =list(range(int(y_min) , int(y_max) , 1))
    zdim =list(range(int(z_min) , int(z_max) , 1))
    grid  = np.array(np.meshgrid(xdim , ydim , zdim)).T.reshape(3 , -1)
    return grid


def mgNew():
    vertices = np.array([(-111.2433, 71.5288, -26.2690),(-111.2433, -70.9316, -26.2690),(-111.2433, -70.9316, 80.8608),(-111.2433, 71.5288, 80.8608),(103.3007, 71.5288, -26.2690),(103.3007, -70.9316, -26.2690),(103.3007, -70.9316, 80.8608),(103.3007, 71.5288, 80.8608)], dtype=np.int64)

    mins = np.min(vertices, axis=0) 
    maxs = np.max(vertices, axis=0)
    xdim = np.arange(mins[0] , maxs[0])
    ydim = np.arange(mins[1] , maxs[1])
    zdim = np.arange(mins[2] , maxs[2])
    grid  = np.array(np.meshgrid(xdim , ydim , zdim)).T.reshape(3 , -1)

    return grid

Подтверждение действительности:

>>> a = mgOriginal()
>>> b = mgNew()
>>> np.all(a==b)
True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...