簡體   English   中英

使用Python創建N維網格

[英]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或更高版本。 但是我還沒有完全解決您的意圖。

可能更簡單(並且repeattile更快):

np.stack([np.repeat(x,3).reshape(3,3), np.repeat(y,3).reshape(3,3).T], 2)

隨着尺寸的增加, transpose可能需要改進。


meshgrid相同(它可能在內部使用repeattile

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM