我正在尝试为数值算法编写函数。函数应该包含一些状态变量的维数和上限和下限。然后,我希望函数在维度上创建一个状态空间。我可以使用griddata轻松地编写这个并静态定义维数,但我想动态定义空间。有人能告诉我如何动态创建数组以传递给meshgrid吗?或者解释如何将字典解压缩(因为这似乎是建议的方法)到数组中?或者甚至如何将meshgrid传递给数组列表?
这是我正在做的静态版本:
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))
答案 0 :(得分: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)
通过这种方式,space
将成为dim
阵列的列表,其形状将广播为其未经精炼的兄弟的大小和形状。例如,如果你有一些像
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