[英]Creating an N-dimensional grid with Python
我正在嘗試為需要並了解距離的算法創建坐標網格。 我知道如何在已知數量的尺寸上執行此操作-就像2D一樣:
x = [0,1,2]
y = [10,11,12]
z = np.zeros((3,3,2))
for i,X in enumerate(x):
for j,Y in enumerate(y):
z[i][j][0] = X
z[i][j][1] = Y
print(z)
--------------------------
array([[[ 0., 10.],
[ 0., 11.],
[ 0., 12.]],
[[ 1., 10.],
[ 1., 11.],
[ 1., 12.]],
[[ 2., 10.],
[ 2., 11.],
[ 2., 12.]]])
這足夠好用。 我最終得到的形狀為(3,3,2),其中2是該點的坐標值。 我試圖用它來創建一個概率面,所以我需要能夠擁有每個點,因為它是自己的“位置”值。 有沒有一種方法可以輕松地將此擴展到N維? 在那里,我將有數量未知的for循環。 由於項目的限制,我可以使用Python內置函數和numpy,但更多或更少。
我已經嘗試過np.meshgrid(),但是它的輸出形狀為(2,3,3),而對其進行整形的嘗試卻從未以正確的順序給出坐標。 關於如何干凈地進行此操作的任何想法?
我可以復制你的z
與
In [223]: np.stack([np.tile([x],(1,3)).reshape(3,3).T,np.tile([y],(3,1))],2)
Out[223]:
array([[[ 0, 10],
[ 0, 11],
[ 0, 12]],
[[ 1, 10],
[ 1, 11],
[ 1, 12]],
[[ 2, 10],
[ 2, 11],
[ 2, 12]]])
瓷磚看起來像
In [224]: np.tile([y],(3,1))
Out[224]:
array([[10, 11, 12],
[10, 11, 12],
[10, 11, 12]])
In [225]: np.tile([x],(1,3)).reshape(3,3).T
Out[225]:
array([[0, 0, 0],
[1, 1, 1],
[2, 2, 2]])
我也許可以清理第二個。 但是基本思想是復制輸入,以便stack
可以將它們組合成所需的(n,n,2)
數組。
一旦了解了這一點,就不難將其擴展到3d或更高版本。 但是我還沒有完全解決您的意圖。
可能更簡單(並且repeat
比tile
更快):
np.stack([np.repeat(x,3).reshape(3,3), np.repeat(y,3).reshape(3,3).T], 2)
隨着尺寸的增加, transpose
可能需要改進。
與meshgrid
相同(它可能在內部使用repeat
或tile
:
In [232]: np.stack(np.meshgrid(x,y, indexing='ij'),2)
Out[232]:
array([[[ 0, 10],
[ 0, 11],
[ 0, 12]],
[[ 1, 10],
[ 1, 11],
[ 1, 12]],
[[ 2, 10],
[ 2, 11],
[ 2, 12]]])
在較大尺寸中:
In [237]: np.stack(np.meshgrid([1,2], [10,20,30], [100,200,300,400], indexing='ij'), 3).sum(axis=-1)
Out[237]:
array([[[111, 211, 311, 411],
[121, 221, 321, 421],
[131, 231, 331, 431]],
[[112, 212, 312, 412],
[122, 222, 322, 422],
[132, 232, 332, 432]]])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.