在循环中创建变量以动态创建griddata()

时间:2014-09-27 12:36:03

标签: python arrays grid

我正在尝试为数值算法编写函数。函数应该包含一些状态变量的维数和上限和下限。然后,我希望函数在维度上创建一个状态空间。我可以使用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))

1 个答案:

答案 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