1 Вопрос: Как создать трехмерную сетку векторов? (каждая позиция в 3D сетке является вектором)

вопрос создан в Wed, May 8, 2019 12:00 AM

Я хочу создать четырехмерный массив с размерами (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
  1. Мне не некрасиво . Почему вы так думаете?
    2019-05-08 16: 08: 50Z
  2. @ kmario23 Мне не нравилось писать qvec трижды. Я подумал, что, может быть, есть «одна строка» или другая функция, которая может генерировать это напрямую.
    2019-05-09 05: 47: 44Z
1 ответ                              1                         

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

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

    
0
2019-05-08 16: 29: 04Z
  1. спасибо за предложение. Это выглядит довольно прямо сейчас :). Да, N - это то же самое.
    2019-05-09 05: 50: 30Z
  2. как именно работает * [freq] * ndim? Я обычно видел * a с левой стороны, но не уверен, как это работает здесь.
    2019-05-09 06: 30: 10Z
  3. [freq]*3 эквивалентен [freq, freq, freq]. Он просто повторяет внутренний элемент, который много раз, здесь 3. Использование * на фронте распаковывает эти элементы (то есть удаляет 0600350621111 с это то, что нужно list. HTH:)
    2019-05-09 07: 49: 07Z
  4. хорошо. Теперь ясно. Спасибо.
    2019-05-09 15: 01: 05Z
numpy.meshgrid
источник размещен Вот