簡體   English   中英

如何在python中生成n維網格

[英]How to generate an n-dimensional grid in python

我想生成一個n維網格。

對於3D網格,我有以下工作代碼(在(-1,1)之間創建一個5X5X5的網格)

import numpy as np
subdivision = 5
step = 1.0/subdivision
grid= np.mgrid[ step-1 : 1.0-step: complex(0, subdivision),
                step-1 : 1.0-step: complex(0, subdivision),
                step-1 : 1.0-step: complex(0, subdivision)]

我想把它推廣到n維,就像這樣

grid = np.mgrid[step-1 : 1.0-step: complex(0,subdivision) for i in range(n)]

但這顯然不起作用。 我也試過了

temp = [np.linspace(step-1 , 1.0-step, subdivision) for i in range(D)]
grid = np.mgrid[temp]

但是這不起作用,因為np.mgrid接受切片

您可以使用實數明確定義步長,而不是使用complex 在我看來,這更簡潔:

grid= np.mgrid[ step-1 : 1.0: step * 2,
                step-1 : 1.0: step * 2,
                step-1 : 1.0: step * 2]

解剖上面的片段,我們看到step-1 : 1.0: step * 2定義了一個切片,並將它們分開,創建了一個三個切片的元組,傳遞給np.mgrid.__getitem__

我們可以通過構造n切片的元組將它推廣到n維:

n = 3
grid= np.mgrid[tuple(slice(step - 1, 1, step * 2) for _ in range(n))]

正如kazemakase所建議的那樣 ,你應該用一個顯式調用slice來替換“short hand”切片符號step-1 : 1.0-step: complex(0,subdivision) ,然后將它組合成一個“ tuple generator”:

D = 6
grid = np.mgrid[tuple(slice(step-1, 1.0-step, complex(0,subdivision)) for i in range(D))]

使用6D網格的結果。

您可以使用meshgridlinspace來執行您想要的操作。

import numpy as np
X1, X2, X3 = np.meshgrid(*[np.linspace(-1,1,5),
                           np.linspace(-1,1,5),
                           np.linspace(-1,1,5)])

對於許多方面,你可以做到

D = 4
subdivision = 5
temp = [np.linspace(-1.0 , 1.0, subdivision) for i in range(D)]
res_to_unpack = np.meshgrid(*temp)
assert(len(res_to_unpack)==D)

暫無
暫無

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

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