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]])
我有一堆大约 10,000~ 10000000 的数组。每个包含坐标点 x、y、z。我已经成功地将它们存储在 Numpy 数组中。我使用
生成了 maxi 和 mininp.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]])