编辑:解决方案
答案发布在下面,使用来自itertools的list prod大大减少了内存使用量,因为它是一个列表对象,我在链接的线程中忽略了这一点。
代码:
n = 2 #dimension
r = np.arange(0.2,2.4,0.1) #range
grid = product(r,repeat=n)
for g in grid:
y = np.array(g)
if np.all(np.diff(g) > 0) == True:
print(f(y)) #or whatever you want to do
我尝试在一定范围内评估具有n个参数的函数。我希望能够在一定范围内更改n,因此用户可以通过他的输入来确定它。
我在here的帮助下得到了一个工作代码,它看起来像这样:
import numpy as np
n = 2 #determine n
r = np.arange(0.2,2.4,0.1) #determine range
grid=np.array(np.meshgrid(*[r]*n)).T.reshape(-1,n) #creates a meshgrid for the range**n
#reduces the number of used points in the grid (the function is symmetrical in its input parameters)
for i in range(0,n-1):
grid = np.array([g for g in grid if g[i]<g[i+1]])
y = np.zeros((grid.shape[0]))
for i in range(grid.shape[0]):
y[i] = f(grid[i,:]) #evaluating function for all lines in grid
这只能达到n等于5或6,然后网格数组和输出数组才会变得很大,以便Spyder处理它(~10 MB)。
有没有办法一次只创建一行meshgrid(参数组合)来评估函数?然后我可以将这些值(grid,y)保存在文本文件中,并在下一步中覆盖它们。
或者有没有办法在没有meshgrid的范围内创建所有n维组合,但是一次只有一个变量n和一个?
答案 0 :(得分:0)
您可能想尝试使用迭代器。似乎itertools.product符合您的需求。
r = np.arange(0,3,1) #determine range
list(product(r,r))
#[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
更多细节:
grid = product([r]*n)
y = np.zeros(... # you should know the exact size
i = 0
for g in grid:
if ...: # check if g in ascending order
y[i] = f(g)
i += 1
顺便说一下y的大小应为comb(len(r), 3)
,请从len(r)
from scipy.special import comb
comb(len(r), 3)
或单行
y = [f(g) for g in grid if is_ascending(g)]
其中is_ascending
是用户定义的过滤函数。