【问题标题】:Numpy : How do I create a meshgrid inside a box?Numpy:如何在盒子内创建网格?
【发布时间】:2023-03-07 19:10:01
【问题描述】:

我有一个带有所有八个角顶点坐标的长方体

(-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)

我想在这个体积内创建体积为 1m x 1m x 1m 的 3D 体素并保存它们的中心坐标。我尝试使用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 是包含所有坐标的清单看起来像这样的所有体素中心。

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

我认为我的实现可能效率低下,所以任何帮助都会有所帮助!

【问题讨论】:

  • 你能发布一个顶点的小样本吗?
  • @Ethan 我在这里迭代的顶点基本上是立方体/盒子的 8 个角顶点。我在所有 3 个维度中获取最大和最小可能坐标,并从中制作一个网格,基本上是所有 3 个列表的笛卡尔积xdim , ydim ,zdim。顶点(角点)是:(-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)
  • 请编辑您的原始帖子以包含示例顶点。这将使任何调查您的问题的人更容易
  • @DrBwts 我已经相应地更新了我的问题!

标签: python python-3.x performance numpy 3d


【解决方案1】:

是的,您绝对可以保护一些行,更重要的是计算。 我假设您将顶点放在一个数组中,因此您可以使用 np.maxnp.min 函数来搜索沿 0 轴的极值。

我猜你想将长方体完全包含在体素网格中,所以我建议你使用 np.ceilnp.floor 进行包含舍入到下一个索引和 .astype(np.int) 转换以确保你可以使用值直接作为索引。

最后,您的np.meshgrid 创建非常好,对于您的1-increments 的特殊情况,您也可以直接将np.mgrid 与索引选择器一起使用

x_max, y_max, z_max = np.ceil(np.max(vertices, axis=0)).astype(np.int)
x_min, y_min, z_min = np.floor(np.min(vertices, axis=0)).astype(np.int)
grid = np.mgrid[x_min:x_max, y_min:y_max, z_min:z_max].reshape(3,-1).T

hth;干杯

【讨论】:

    【解决方案2】:

    如果将顶点转换为 int64 类型的 numpy 数组,则可以大大简化:

    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
    

    【讨论】:

      猜你喜欢
      • 2021-06-02
      • 2016-02-02
      • 1970-01-01
      • 2020-04-12
      • 2014-08-06
      • 1970-01-01
      • 2020-02-02
      • 1970-01-01
      • 2021-10-18
      相关资源
      最近更新 更多