如何使用numpy.mgrid创建多维数组

6
我想知道如何使用numpy mgrid创建一个网格(多维数组),对于未知数量的维度(D),每个维度都有下限和上限以及箱子数:
n_bins =  numpy.array([100 for  d in numpy.arrange(D)])
bounds = numpy.array([(0.,1) for d in numpy.arrange(D)])
grid = numpy.mgrid[numpy.linspace[(numpy.linspace(bounds(d)[0], bounds(d)[1], n_bins[d] for d in numpy.arrange(D)]

我猜上面的方法行不通,因为mgrid创建的是索引数组而不是值数组。但如何使用它来创建值数组呢?
谢谢。
Aso.agile

numpy.arange("数组范围"),而不是 numpy.arrange - endolith
1个回答

6
您可能会使用:
np.mgrid[[slice(row[0], row[1], n*1j) for row, n in zip(bounds, n_bins)]]

import numpy as np
D = 3
n_bins =  100*np.ones(D)
bounds = np.repeat([(0,1)], D, axis = 0)

result = np.mgrid[[slice(row[0], row[1], n*1j) for row, n in zip(bounds, n_bins)]]
ans = np.mgrid[0:1:100j,0:1:100j,0:1:100j]

assert np.allclose(result, ans)

请注意,np.ogrid可用于许多需要np.mgrid的地方,因为数组较小,所以它需要更少的内存。

谢谢@unutbu,它运行得很好。现在如何将这个网格转换为D维点,即100**D x D的形状? - Aso Agile
“reshape” 确实会给出 100D 个 D-向量,但令人惊讶的是它们并不唯一,这也意味着并不是所有可能的向量都在其中。有什么方法可以获得网格中的所有 D-点呢?我实际上将其想象为一个 100D 的表格,并不知道如何处理 “mgrid” 给出的额外维度。 - Lev Levitsky
1
@LevLevitsky:要在网格中获取点,请使用result.reshape(D, -1).T-1将被替换为必须使用数组中的所有值的任何数字。感谢您的问题,这可能更像是AsoAgile正在寻找的内容。 - unutbu
1
假设您有一个函数,如 def f(x): return x[0]**2+x[1]。然后 grid = np.mgrid[0:5,0:5] 完美地设置了评估 f(grid) 的条件,它计算网格上每个点的 f(x)。请注意,np.ogrid 返回较小的数组,在此处也可以使用广播来实现。 - unutbu
1
@LevLevitsky:确实,您不能在任何函数中使用此“技巧”。计算必须在numpy数组的术语中有意义。如果您的计算无法用数组表示,则只能使用速度慢得多的“vectorize”或“frompyfunc”函数。 - unutbu
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接