這是如何numpy.mgrid使用的方式。
grid = np.mgrid[x1:y1:100j , x2:y2:100j, ..., xn:yn:100j]
但是,我發現這種結構非常令人討厭。因此,我想創建f如下作業的函式:
f([(x1,y1,100),...,(xn,yn,100)]) = np.mgrid[x1:y1:100j , x2:y2:100j, ..., xn:yn:100j]
我該如何創建f?
(這里是np.mgrid的源代碼)
uj5u.com熱心網友回復:
只需回圈傳遞給的每個專案f并用 從中切出一個切片,slice然后100j從100乘以100:1j
def f(items):
slices = [slice(i[0], i[1], 1j * i[2]) for i in items]
return np.mgrid[slices]
輸出:
>>> np.all( f([(1,2,5), (2,3,5)]) == np.mgrid[1:2:5j, 2:3:5j] )
True
您可以通過使用*items而不是更簡單地呼叫該函式items:
def f(*items):
slices = [slice(i[0], i[1], 1j * i[2]) for i in items]
return np.mgrid[slices]
輸出:
>>> np.all( f([1,2,5], [2,3,5]) == np.mgrid[1:2:5j, 2:3:5j] )
True
uj5u.com熱心網友回復:
mgrid是一個可愛的類的實體,它讓我們可以使用索引符號。在幕后,它使用np.linspace(或np.arange)生成范圍。
In [29]: x1,y1 = 0,1; x2,y2 = 1,3
In [30]: np.mgrid[x1:y1:3j, x2:y2:4j]
Out[30]:
array([[[0. , 0. , 0. , 0. ],
[0.5 , 0.5 , 0.5 , 0.5 ],
[1. , 1. , 1. , 1. ]],
[[1. , 1.66666667, 2.33333333, 3. ],
[1. , 1.66666667, 2.33333333, 3. ],
[1. , 1.66666667, 2.33333333, 3. ]]])
meshgrid是等價的功能。我懷疑它是原始功能,并且mgrid(and ogrid) 是輔助版本:
In [31]: np.meshgrid(np.linspace(x1,y1,3), np.linspace(x2,y2,4), indexing='ij')
Out[31]:
[array([[0. , 0. , 0. , 0. ],
[0.5, 0.5, 0.5, 0.5],
[1. , 1. , 1. , 1. ]]),
array([[1. , 1.66666667, 2.33333333, 3. ],
[1. , 1.66666667, 2.33333333, 3. ],
[1. , 1.66666667, 2.33333333, 3. ]])]
mgrid創建一個 nd 陣列;meshgrid回傳一個陣列串列。否則它們是等價的。 np.array(Out[31])創建陣列。
稀疏版本
ogrid生成一對“稀疏”陣列,它們的broadcasting功能與 相同:
In [37]: np.ogrid[x1:y1:3j, x2:y2:4j]
Out[37]:
[array([[0. ],
[0.5],
[1. ]]),
array([[1. , 1.66666667, 2.33333333, 3. ]])]
meshgrid有一個等效的sparse模式:
In [38]: np.meshgrid(np.linspace(x1,y1,3), np.linspace(x2,y2,4), indexing='ij',
...: sparse=True)
Out[38]:
[array([[0. ],
[0.5],
[1. ]]),
array([[1. , 1.66666667, 2.33333333, 3. ]])]
我們可以使用以下方法創建相同的陣列對:
In [39]: np.ix_(np.linspace(x1,y1,3), np.linspace(x2,y2,4))
Out[39]:
(array([[0. ],
[0.5],
[1. ]]),
array([[1. , 1.66666667, 2.33333333, 3. ]]))
甚至:
In [40]: (np.linspace(x1,y1,3)[:,None], np.linspace(x2,y2,4)[None,:])
Out[40]:
(array([[0. ],
[0.5],
[1. ]]),
array([[1. , 1.66666667, 2.33333333, 3. ]]))
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/448649.html
上一篇:將3D陣列與2D陣列相乘
