Numpy сетки векторов - PullRequest
0 голосов
/ 03 мая 2018

Я пытаюсь настроить некоторый код для выполнения некоторых численных расчетов на трехмерных векторных полях, таких как электрические или магнитные поля. У меня проблемы с настройкой моих мешей так, как мне бы хотелось. Рассмотрим эту программу:

import numpy as np

X1, Y1, Z1 = np.meshgrid(np.linspace(-10,10,10),np.linspace(-10,10,10),np.linspace(-10,10,10))

def scalarf(x,y,z):
    return x**2 + y**2 + z**2

def vectorf(x,y,z):
    return np.array([y,x,z])


def afunc(p,v):
    return np.cross(p,v)

V = scalarf(X1,Y1,Z1)
F = vectorf(X1,Y1,Z1)
# This line clearly not working
F2 = afunc(F,np.array([1,0,0]))

print (V.shape)
print (F.shape)

Вывод этого дает (10,10,10) для V и (3,10,10,10) для F. Таким образом, V представляет собой массив скалярных значений 10x10x10, как и предполагалось. Но для F я хотел получить массив из 3 элементов размером 10x10x10, представляющий математические трехмерные векторы. Вместо этого у меня есть массив из 3 элементов, содержащий массив 10x10x10 в качестве каждого из его элементов. Итак, я предполагаю, что хочу (10,10,10,3) форму. В конечном итоге я хочу иметь возможность (например) запускать такие функции, как afun в приведенном выше. Опять же, здесь предполагается, что теперь F2 будет новым массивом векторов 10x10x10. На данный момент это просто не удается, потому что я предполагаю, что он пытается выполнить перекрестное произведение с массивом 10x10x10 и фиксированным трехмерным вектором в вызове функции.

Правильно ли я делаю это дистанционно? Есть ли другой способ создания трехмерного массива векторов? Кстати, я также пытался использовать mgrids с почти таким же результатом.

Любая помощь, указывающая мне правильное направление, очень ценится.

1 Ответ

0 голосов
/ 03 мая 2018

Используйте np.stack с ключевым словом axis

def vectorf(x, y, z):
    return np.stack((y, x, z), axis = -1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...