我想创建一个对应于网格的点列表。因此,如果我想创建从(0, 0)
到(1, 1)
的区域的网格,它将包含点(0, 0)
,(0, 1)
,(1, 0)
和(1, 0)
。
我知道这可以用下面的代码来完成:
g = np.meshgrid([0,1],[0,1])
np.append(g[0].reshape(-1,1),g[1].reshape(-1,1),axis=1)
产生结果:
array([[0, 0],
[1, 0],
[0, 1],
[1, 1]])
我的问题是双重的:
1.有没有更好的办法?
1.有没有一种方法可以将其推广到更高的维度?
7条答案
按热度按时间kupeojn61#
我刚刚注意到numpy中的文档提供了一种更快的方法来做到这一点:
使用链接的meshgrid2函数并将“ravel”Map到结果网格,可以轻松地将其推广到更多维度。
对于每个轴上有1000个刻度的3D数组,结果比zip方法快约35倍。
来源:http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.gaussian_kde.html#scipy.stats.gaussian_kde
要比较这两种方法,请考虑以下代码部分:
创建众所周知的刻度线,这将有助于创建网格。
为meshgrid定义mgilson链接到的函数:
创建网格并计算两个函数的时间。
iq3niunx2#
你的网格点总是整数吗?如果是,你可以使用
numpy.ndindex
更高维度:
不幸的是,这不符合OP的要求,因为积分假设(从0开始)不满足。我只会留下这个答案,以防其他人在寻找同样的东西,这些假设是真的。
另一种方法是使用
zip
:这部分可以很好地扩展到任意维度。不幸的是,
np.meshgrid
不能很好地扩展到多维,因此这部分需要解决,或者(假设它工作),您可以使用此SO answer创建自己的ndmeshgrid函数。hiz5n14c3#
另一种方法是:
其可以推广到更高的维度,例如:
f1tvaqid4#
要获得从0到1的网格坐标,整形可以完成这项工作。这里有2D和3D的例子。也适用于浮动。
ecfsfe2w5#
一个简单的3D示例(我猜可以扩展到N维,但要注意最终的维度和RAM使用情况):
在:
2.76 s ± 185 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
其产生:
Python
3.6.9
Numpy:
1.19.5
r7knjye26#
我用下面的方法将meshgrid转换成MX2数组。同时将向量列表改为迭代器可以使它变得非常快。
对于使用发生器的N-D阵列
zour9fqk7#
这是N-D的情况。
我们的想法是,我们将网格组合成一个数组,使某个东西n x dim 1 x.. dimn;然后,我们将其移动到末尾(使用moveaxis -转置的概括),并使除了最后一个dims之外的所有内容变平。