Using only a slice of meshgrid or replacing it for evaluating a function
编辑:解决方案
答案发布在下面,使用itertools中的list prod可以大大减少内存使用,因为它是一个list对象,在链接的线程中我忽略了这一点。
代码:
1 2 3 4 5 6 7 8 9 | 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,以便用户可以通过输入来确定它。
我从这里得到了一个有效的帮助代码,它看起来像这样:
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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)。
有没有一种方法只能一次创建一行网格(参数组合)来评估函数?然后,我可以将这些值(grid,y)保存在文本文件中,并在下一步中覆盖它们。
或者是否有一种方法可以创建范围内的所有n维组合而不使用网状网格,但一次具有一个变量n,一次又一个?
您可能想尝试迭代器。看来itertools.product很适合您。
1 2 3 | 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)] |
更多详细信息:
1 2 3 4 5 6 7 | 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的大小应为
中选择3
1 2 | from scipy.special import comb comb(len(r), 3) |
或单线
1 | y = [f(g) for g in grid if is_ascending(g)] |
其中