Python Numpy:如何创建类似网格的数组?

Python Numpy:如何创建类似网格的数组?,python,numpy,Python,Numpy,我想创建一个表示X-Y面板(-50,50)的数组。即: [-50,-50],-49,-50],-48,-50]…[50,50]],长度为101*101 显然,我可以通过双循环从(-50,50)生成。我想知道首选的方法是什么?我不能100%确定您希望输出是什么样子。这对你有用吗 import numpy as np a=np.linspace(-2, 2, 5) b=np.linspace(-2, 2, 5) c,d=np.meshgrid(a,b) c+d >>> array(

我想创建一个表示X-Y面板(-50,50)的数组。即:
[-50,-50],-49,-50],-48,-50]…[50,50]]
,长度为101*101


显然,我可以通过双循环从(-50,50)生成。我想知道
首选的
方法是什么?

我不能100%确定您希望输出是什么样子。这对你有用吗

import numpy as np
a=np.linspace(-2, 2, 5)
b=np.linspace(-2, 2, 5)
c,d=np.meshgrid(a,b)
c+d
>>> array([[-4., -3., -2., -1.,  0.],
   [-3., -2., -1.,  0.,  1.],
   [-2., -1.,  0.,  1.,  2.],
   [-1.,  0.,  1.,  2.,  3.],
   [ 0.,  1.,  2.,  3.,  4.]])
这个怎么样:

In [15]: import numpy as np

In [16]: a = np.arange(-3,4)

In [17]: a1 = np.tile(a, (7,1))

In [18]: np.dstack((a1, a1.T)).reshape(-1, 2)
结果:

array([[-3, -3],
       [-2, -3],
       [-1, -3],
       [ 0, -3],
       [ 1, -3],
        ....
       [-1,  3],
       [ 0,  3],
       [ 1,  3],
       [ 2,  3],
       [ 3,  3]])

numpy.meshgrid
对我来说显然是最清晰的方式(正如@benbo所提到的),您还需要一个步骤来
ravel
展平二维网格阵列:

In [131]: import numpy as np
     ...: x=np.linspace(-2, 2, 5)
     ...: y=np.linspace(-2, 2, 5)
     ...: xx,yy=np.meshgrid(x,y)
     ...: coords=np.array((xx.ravel(), yy.ravel())).T

In [132]: coords
Out[132]: 
array([[-2., -2.],
       [-1., -2.],
       [ 0., -2.],
       [ 1., -2.],
       [ 2., -2.],
       [-2., -1.],
       ......
       [ 1.,  2.],
       [ 2.,  2.]])

In [133]:
或者如@John所述,使用
np.c
缩短代码以跳过转置:

coords=np.c_[xx.ravel(), yy.ravel()]
基准:

In [156]: %timeit coords=np.array((xx.ravel(), yy.ravel())).T
100000 loops, best of 3: 14.6 µs per loop

In [157]: %timeit coords=np.c_[xx.ravel(), yy.ravel()] #not as efficient as ↑
10000 loops, best of 3: 47.6 µs per loop

可能是这样的:

In [1]: coords = np.array([[_v, _v] for _v in range(-50, 51)])

In [2]: coords
Out[22]: 
array([[-50, -50],
       [-49, -49],
       [-48, -48],
       ...
       ...
       ...
       [ 48,  48],
       [ 49,  49],
       [ 50,  50]])

有很多答案!这是另一个,基于:

如果第一个坐标变化不一定最快,则可以删除通过
[::-1]
实现的重新排序:

In [1463]: coords = (np.indices((high-low,)*ndim) + low).reshape(ndim, -1).T

In [1464]: coords
Out[1464]: 
array([[-50, -50],
       [-50, -49],
       [-50, -48],
       ..., 
       [ 50,  48],
       [ 50,  49],
       [ 50,  50]])
使用
ndim
提供免费功能;它允许生成更高维度的类似数组:

In [1465]: ndim = 3

In [1466]: coords = (np.indices((high-low,)*ndim) + low)[::-1].reshape(ndim, -1).T

In [1467]: coords
Out[1467]: 
array([[-50, -50, -50],
       [-49, -50, -50],
       [-48, -50, -50],
       ..., 
       [ 48,  50,  50],
       [ 49,  50,  50],
       [ 50,  50,  50]])

抱歉,我误解了你的意思,你说的网格化是我做这件事的正确方式。你也可以使用np.c_uuu[xx.ravel(),yy.ravel()]并跳过转置。有趣的是,我没想到
np.array
的方式会更快。始终检查
%timeit
In [1463]: coords = (np.indices((high-low,)*ndim) + low).reshape(ndim, -1).T

In [1464]: coords
Out[1464]: 
array([[-50, -50],
       [-50, -49],
       [-50, -48],
       ..., 
       [ 50,  48],
       [ 50,  49],
       [ 50,  50]])
In [1465]: ndim = 3

In [1466]: coords = (np.indices((high-low,)*ndim) + low)[::-1].reshape(ndim, -1).T

In [1467]: coords
Out[1467]: 
array([[-50, -50, -50],
       [-49, -50, -50],
       [-48, -50, -50],
       ..., 
       [ 48,  50,  50],
       [ 49,  50,  50],
       [ 50,  50,  50]])