Nampi Magrid / 威尔

Numpy mgrid/ arange

我有一堆大约 10,000~ 10000000 的数组。每个包含坐标点 x、y、z。我已经成功地将它们存储在 Numpy 数组中。我使用

生成了 maxi 和 mini
np.array(np.amin(Vertex_combined[:,:,:],axis=1))
np.array(np.amax(Vertex_combined[:,:,:],axis=1))

这些生成 2 个范围

maxs=array([[406.78, 805.73, 345.14],
           [407.57, 805.83, 345.14],
           [407.9 , 805.83, 314.19]])
mins=array([[405.05, 805.52, 314.15],
           [405.84, 805.62, 314.15],
           [406.78, 805.19, 309.75]])

现在我需要生成

np.mgrid[mins[1,0]:maxs[1,0]:0.5, mins[1,1]:maxs[1,1]:0.5].reshape(2,-1).T
array([[405.84, 805.62],
       [406.34, 805.62],
       [406.84, 805.62],
       [407.34, 805.62]])

当我尝试时这适用于单个阵列

np.mgrid[mins[:,0]:maxs[:,0]:0.5, mins[:,1]:maxs[:,1]:0.5].reshape(2,-1).T

不起作用。对我做错了什么的任何帮助或解释都会有很大帮助。 谢谢,

Traceback (most recent call last):
  File "C:\Users\R414065\AppData\Local\Programs\Python\Python38\lib\site-packages\numpy\lib\index_tricks.py", line 164, in __getitem__
    int(math.ceil((kk.stop - start) / (step * 1.0))))
TypeError: only size-1 arrays can be converted to Python scalars

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<pyshell#12>", line 1, in <module>
    np.hstack(np.mgrid[mins[:,0]:maxs[:,0]:0.5, mins[:,2]:maxs[:,2]:0.5].reshape(2,-1).T)
  File "C:\Users\R414065\AppData\Local\Programs\Python\Python38\lib\site-packages\numpy\lib\index_tricks.py", line 194, in __getitem__
    step = key.step
AttributeError: 'tuple' object has no attribute 'step'

正如我在评论中所写,mgrid 为每个 'dimension' 生成 arange(或其等价物)。这仅适用于标量。

但让我们看看您的边界创建的范围:

In [53]: alist=[np.arange(x,y,.5) for x,y in zip(mins[:,0],maxs[:,0])]
In [54]: [x.shape for x in alist]
Out[54]: [(4,), (4,), (3,)]
In [55]: alist=[np.arange(x,y,.5) for x,y in zip(mins[:,1],maxs[:,1])]
In [56]: [x.shape for x in alist]
Out[56]: [(1,), (1,), (2,)]

每当我看到形状不同的数组列表时,我想 - 无法避免循环。

如果我们希望每个范围的元素数量相同,我们可以使用 linspace:

In [57]: x = np.linspace(mins[:,0],maxs[:,0],4)
In [58]: y = np.linspace(mins[:,1],maxs[:,1],2)
In [59]: x
Out[59]: 
array([[405.05      , 405.84      , 406.78      ],
       [405.62666667, 406.41666667, 407.15333333],
       [406.20333333, 406.99333333, 407.52666667],
       [406.78      , 407.57      , 407.9       ]])
In [60]: y
Out[60]: 
array([[805.52, 805.62, 805.19],
       [805.73, 805.83, 805.83]])

只要范围内的元素个数相同,范围之间的差异只是比例问题。

我们可以从这些生成网格。它使它们变平:

In [71]: I,J=np.meshgrid(x, y, indexing="ij")
In [72]: I.shape
Out[72]: (12, 6)

我们可以将前面的列表组合成一个数组:

In [73]: alist
Out[73]: [array([805.52]), array([805.62]), array([805.19, 805.69])]
In [74]: np.hstack(alist)
Out[74]: array([805.52, 805.62, 805.19, 805.69])

但我怀疑您想要生成单独的网格并将它们组合起来,而不是先组合范围。

简而言之,您将需要迭代 - 除非我遗漏了您所寻求内容的一些细微差别。

编辑

这是完整的迭代解决方案 - 我认为您应该展示它,因为它阐明了问题:

执行个人 mgrid 不整形:

In [75]: alist = [
    ...:     np.mgrid[mins[i, 0] : maxs[i, 0] : 0.5, mins[i, 1] : maxs[i, 1] : 0
    ...: .5]
    ...:     for i in range(3)
    ...: ]
In [76]: alist
Out[76]: 
[array([[[405.05],
         [405.55],
         [406.05],
         [406.55]],
 
        [[805.52],
         [805.52],
         [805.52],
         [805.52]]]),
 array([[[405.84],
         [406.34],
         [406.84],
         [407.34]],
 
        [[805.62],
         [805.62],
         [805.62],
         [805.62]]]),
 array([[[406.78, 406.78],
         [407.28, 407.28],
         [407.78, 407.78]],
 
        [[805.19, 805.69],
         [805.19, 805.69],
         [805.19, 805.69]]])]

这突出了每个网格的不同之处。重塑后它们仍然不同:

In [77]: blist = [x.reshape(2, -1).T for x in alist]
In [78]: blist
Out[78]: 
[array([[405.05, 805.52],
        [405.55, 805.52],
        [406.05, 805.52],
        [406.55, 805.52]]),
 array([[405.84, 805.62],
        [406.34, 805.62],
        [406.84, 805.62],
        [407.34, 805.62]]),
 array([[406.78, 805.19],
        [406.78, 805.69],
        [407.28, 805.19],
        [407.28, 805.69],
        [407.78, 805.19],
        [407.78, 805.69]])]

它们可以连接成一个 (n,2) 数组:

In [79]: np.vstack(blist)
Out[79]: 
array([[405.05, 805.52],
       [405.55, 805.52],
       [406.05, 805.52],
       [406.55, 805.52],
       [405.84, 805.62],
       [406.34, 805.62],
       [406.84, 805.62],
       [407.34, 805.62],
       [406.78, 805.19],
       [406.78, 805.69],
       [407.28, 805.19],
       [407.28, 805.69],
       [407.78, 805.19],
       [407.78, 805.69]])