2014-09-27 123 views
0

我正在嘗試爲數值算法編寫一個函數。函數應該考慮一些狀態變量的維數和上下界。然後,我希望函數在維度上創建一個狀態空間。我可以使用griddata和靜態定義維度的數量來輕鬆地編寫它,但我想動態地定義空間。有人可以告訴我如何動態創建陣列傳遞給meshgrid嗎?或者說明如何將字典解壓縮到數組中?(因爲這似乎是建議的方法)?甚至如何通過meshgrid數組列表?在循環中創建變量以動態創建griddata()

下面是我在做什麼靜態版本:

import numpy as np 

#Define the bounds of the state space 
up_bound = 1 
low_bound = 0 

#Define the number of dimensions 
dim = 4 
m = 2^j - 1, where j is the identifier of the grid. 
j = 6 

#Define number of points 
m = 2**j - 1 

#Define the state space axes using the linear space function 
Xi = np.linspace(low_bound, up_bound, m) 
Phi = np.linspace(low_bound, up_bound, m) 
omega = np.linspace(low_bound, up_bound, m) 
delta = np.linspace(low_bound, up_bound, m) 

space = np.asarray(np.meshgrid(Xi, Phi, omega, delta)) 

回答

1

您正在尋找* argument-unpacking operator。它可以讓你的論點任意數量傳遞給函數:

import numpy as np 

up_bound = 1 
low_bound = 0 
dim = 4 
j = 6 
m = 2**j - 1 

space = np.asarray(np.meshgrid(*[np.linspace(low_bound, up_bound, m)]*dim)) 

上面的代碼創建了非常大的數組作爲dim增長,併爲一個相當無趣的結果 - 有很多重複的陣列中, space

你幾乎肯定更好 - 並在此過程將節省空間和時間 - 通過使用sparse=True參數:

space = np.meshgrid(*[np.linspace(low_bound, up_bound, m)]*dim, sparse=True) 

使用這種方式時,spacedim陣列的列表,其形狀將廣播到他們未稀疏的弟兄的大小和形狀。舉例來說,如果你有一個像

def f(x): 
    return x[0] ** 2 + x[1] ** 2 + x[2] - x[3] 

一些功能與

space = np.meshgrid(*[np.linspace(low_bound, up_bound, m)]*dim, sparse=True) 
space_old = np.asarray(np.meshgrid(*[np.linspace(low_bound, up_bound, m)]*dim)) 

然後計算F(空間)給出了相同的結果爲f(space_old)

In [140]: np.allclose(f(space_old), f(space)) 
Out[140]: True 

然而,space會明顯小於space_old,很多更快產生:

In [148]: %timeit np.asarray(np.meshgrid(*[np.linspace(low_bound, up_bound, m)]*dim)) 
1 loops, best of 3: 635 ms per loop 

In [149]: %timeit np.meshgrid(*[np.linspace(low_bound, up_bound, m)]*dim, sparse=True) 
10000 loops, best of 3: 26.1 µs per loop 
+0

完美!感謝您的快速響應。現在真正的問題:你有什麼想法如何加快meshgrid?我嘗試過使用cython,但它並沒有給我更多的速度。 – pdevar 2014-09-27 16:19:35

+0

謝謝unutbu!真正有用的編輯。 – pdevar 2014-09-30 06:50:16