如何生成矢量的3D网格? (3D网格中的每个位置都是一个向量)

时间:2019-05-08 16:02:21

标签: python numpy vector grid numpy-ndarray

我想生成一个尺寸为(dim,N,N,N)的四维数组。第一个分量ndim = 3且N对应于网格长度。如何使用python优雅地生成这样的数组?

这是我的“丑陋”实现:

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

1 个答案:

答案 0 :(得分:0)

您的实现对我来说足够好了。但是,这里有一些改进使其更漂亮:

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是相同的,因为您使用了相同的变量名。