如何生成矢量的 3D 网格? (3D 网格中的每个位置都是一个向量)
How to generate a 3D grid of vectors ? (each position in the 3D grid is a vector)
我想生成一个维度为 (dim,N,N,N) 的四维数组。第一个分量 ndim =3,N 对应于网格长度。如何使用 python 优雅地生成这样一个数组?
这是我的 'ugly' 实现:
qvec=np.zeros([ndim,N,N,N])
freq = np.arange(-(N-1)/2.,+(N+1)/2.)
x, y, z = np.meshgrid(freq[range(N)], freq[range(N)], freq[range(N)],indexing='ij')
qvec[0,:,:,:]=x
qvec[1,:,:,:]=y
qvec[2,:,:,:]=z
我觉得你的实现很不错。但是,这里有一些改进以使其更漂亮:
qvec=np.empty([ndim,N,N,N])
freq = np.arange(-(N-1)/2.,+(N+1)/2.)
x, y, z = np.meshgrid(*[freq]*ndim, indexing='ij')
qvec[0,...]=x # qvec[0] = x
qvec[1,...]=y # qvec[1] = y
qvec[2,...]=z # qvec[2] = z
改进是:
- 使用
numpy.empty()
代替 numpy.zeros()
- 摆脱
range(N)
索引,因为那样会得到相同的 freq
数组
- 使用可迭代解包并利用
ndim
- 对维度使用省略号表示法(这也不是必需的)
因此,在结合以上所有要点后,下面的代码就足够了:
qvec=np.empty([ndim,N,N,N])
freq = np.arange(-(N-1)/2.,+(N+1)/2.)
x, y, z = np.meshgrid(*[freq]*ndim, indexing='ij')
qvec[0:ndim] = x, y, z
注意:我假设 N
相同,因为您使用了相同的变量名称。
我想生成一个维度为 (dim,N,N,N) 的四维数组。第一个分量 ndim =3,N 对应于网格长度。如何使用 python 优雅地生成这样一个数组?
这是我的 'ugly' 实现:
qvec=np.zeros([ndim,N,N,N])
freq = np.arange(-(N-1)/2.,+(N+1)/2.)
x, y, z = np.meshgrid(freq[range(N)], freq[range(N)], freq[range(N)],indexing='ij')
qvec[0,:,:,:]=x
qvec[1,:,:,:]=y
qvec[2,:,:,:]=z
我觉得你的实现很不错。但是,这里有一些改进以使其更漂亮:
qvec=np.empty([ndim,N,N,N])
freq = np.arange(-(N-1)/2.,+(N+1)/2.)
x, y, z = np.meshgrid(*[freq]*ndim, indexing='ij')
qvec[0,...]=x # qvec[0] = x
qvec[1,...]=y # qvec[1] = y
qvec[2,...]=z # qvec[2] = z
改进是:
- 使用
numpy.empty()
代替numpy.zeros()
- 摆脱
range(N)
索引,因为那样会得到相同的freq
数组 - 使用可迭代解包并利用
ndim
- 对维度使用省略号表示法(这也不是必需的)
因此,在结合以上所有要点后,下面的代码就足够了:
qvec=np.empty([ndim,N,N,N])
freq = np.arange(-(N-1)/2.,+(N+1)/2.)
x, y, z = np.meshgrid(*[freq]*ndim, indexing='ij')
qvec[0:ndim] = x, y, z
注意:我假设 N
相同,因为您使用了相同的变量名称。