Как создать трехмерную сетку векторов?(каждая позиция в 3D сетке является вектором) - PullRequest
1 голос
/ 08 мая 2019

Я хочу создать четырехмерный массив с размерами (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 голосов
/ 08 мая 2019

Ваша реализация выглядит достаточно хорошо для меня. Тем не менее, вот некоторые улучшения, чтобы сделать его красивее:

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 - то же самое, поскольку вы использовали одно и то же имя переменной.

...