Python Numpy:如何创建类似网格的数组?
我想创建一个表示X-Y面板(-50,50)的数组。即: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(
[-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]])