簡體   English   中英

為什么 meshgrid 將 (x, y, z) 順序更改為 (y, x, z)?

[英]Why is meshgrid changing (x, y, z) order to (y, x, z)?

我有 3 個向量:

u = np.array([0, 100, 200, 300]) #hundreds
v = np.array([0, 10, 20]) #tens
w = np.array([0, 1]) #units

然后我用np.meshgrid求和u[i]+v[j],w[k]

x, y, z = np.meshgrid(u, v, w)
func1 = x + y + z

所以,當 (i,j,k)=(3,2,1), func1[i, j, k]應該返回 321,但如果我把func1[2, 3, 1] ,我只會得到 321 。 為什么它在u之前要求我提供向量v 我應該改用numpy.ix_嗎?

meshgrid文檔:

Notes
-----
This function supports both indexing conventions through the indexing
keyword argument.  Giving the string 'ij' returns a meshgrid with
matrix indexing, while 'xy' returns a meshgrid with Cartesian indexing.
In the 2-D case with inputs of length M and N, the outputs are of shape
(N, M) for 'xy' indexing and (M, N) for 'ij' indexing.  In the 3-D case
with inputs of length M, N and P, outputs are of shape (N, M, P) for
'xy' indexing and (M, N, P) for 'ij' indexing. 

In [109]: U,V,W = np.meshgrid(u,v,w, sparse=True)
In [110]: U
Out[110]: 
array([[[  0],        # (1,4,1)
        [100],
        [200],
        [300]]])
In [111]: U+V+W
Out[111]: 
array([[[  0,   1],
        [100, 101],
        [200, 201],
        [300, 301]],

       [[ 10,  11],
        [110, 111],
        [210, 211],
        [310, 311]],

       [[ 20,  21],
        [120, 121],
        [220, 221],
        [320, 321]]])

結果是(3,4,2)數組; 這是注釋中描述的cartesian情況。

隨着記錄的indexing更改:

In [113]: U,V,W = np.meshgrid(u,v,w, indexing='ij',sparse=True)
In [114]: U.shape
Out[114]: (4, 1, 1)
In [115]: (U+V+W).shape
Out[115]: (4, 3, 2)

哪個與您想要的ix_匹配:

In [116]: U,V,W = np.ix_(u,v,w)
In [117]: (U+V+W).shape
Out[117]: (4, 3, 2)

歡迎您使用。 或者甚至是文檔中提到的np.ogrid

甚至是自制的廣播:

In [118]: (u[:,None,None]+v[:,None]+w).shape
Out[118]: (4, 3, 2)

也許二維布局澄清了兩個坐標:

In [119]: Out[111][:,:,0]
Out[119]: 
array([[  0, 100, 200, 300],          # u going across, x-axis
       [ 10, 110, 210, 310],
       [ 20, 120, 220, 320]])
In [120]: (u[:,None,None]+v[:,None]+w)[:,:,0]
Out[120]: 
array([[  0,  10,  20],              # u going down - rows
       [100, 110, 120],
       [200, 210, 220],
       [300, 310, 320]])

對於您的索引方法,您需要軸 0 為 1s 的增量方向,軸 1 為 10s,軸 2 為 100s。

您可以轉置以交換軸以適合您的索引方法 -

u = np.array([0, 100, 200, 300]) #hundreds
v = np.array([0, 10, 20, 30]) #tens
w = np.array([0, 1, 2, 3]) #units

x,y,z = np.meshgrid(w,v,u)

func1 = x + y + z

func1 = func1.transpose(2,0,1)
func1
           # axis 0 is 1s 
        #------------------>
array([[[  0,   1,   2,   3],
        [ 10,  11,  12,  13], #
        [ 20,  21,  22,  23], # Axis 1 is 10s
        [ 30,  31,  32,  33]],

       [[100, 101, 102, 103],      #
        [110, 111, 112, 113],      # Axis 2 is 100s
        [120, 121, 122, 123],      #
        [130, 131, 132, 133]],

       [[200, 201, 202, 203],
        [210, 211, 212, 213],
        [220, 221, 222, 223],
        [230, 231, 232, 233]],

       [[300, 301, 302, 303],
        [310, 311, 312, 313],
        [320, 321, 322, 323],
        [330, 331, 332, 333]]])

通過索引來測試這個 -

>> func1[2,3,1]
231

>> func1[3,2,1]
321

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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