Генерация векторов положения из Numpy Meshgrid - PullRequest
1 голос
/ 28 октября 2019

Я попытаюсь объяснить мою проблему здесь, не вдаваясь в подробности реального приложения, чтобы мы могли оставаться в курсе кода. По сути, мне нужно сделать операции над векторным полем. Мой первый шаг - создать поле как

x,y,z = np.meshgrid(np.linspace(-5,5,10),np.linspace(-5,5,10),np.linspace(-5,5,10))

Имейте в виду, что это обобщенный случай, в программе границы векторного поля не совпадают. В общем, я хотел бы сказать что-то вроде

u,v,w = f(x,y,z).

К сожалению, этот случай требует более сложных операций. Мне нужно использовать формулу, аналогичную

Simplified version of Biot Savart Equation, где вектор r определен в программе как np.array([xgrid-x,ygrid-y,zgrid-z]), деленный на собственную норму. По сути, это вектор, указывающий из каждой точки пространства на позицию (x, y, z)

Теперь Numpy реализовал функцию кросс-произведения, используя np.cross(), но я не могу создать"сетка векторов", как мне нужно. У меня есть лямбда-функция, которая по существу

xgrid,ygrid,zgrid=np.meshgrid(np.linspace(-5,5,10),np.linspace(-5,5,10),np.linspace(-5,5,10)) B(x,y,z) = lambda x,y,z: np.cross(v,np.array([xgrid-x,ygrid-y,zgrid-z]))

Теперь массив v импортирован из другого класса и, кажется, работает нормально, но второй массив, np.array([xgrid-x,ygrid-y,zgrid-z])не правильная форма, потому что это «вектор сетки сетки» вместо «сетки сетки векторов». Моя большая проблема в том, что я не могу найти метод, с помощью которого можно отформатировать сетку таким образом, чтобы функция np.cross() могла использовать вектор положения. Есть ли способ сделать это?

Первоначально я думал, что я мог бы сделать что-то вроде:

x,y,z = np.meshgrid(np.linspace(-2,2,5),np.linspace(-2,2,5),np.linspace(-2,2,5)) A = np.array([x,y,z]) cross_result = np.cross(np.array(v),A)

Это, однако, возвращает следующую ошибкукоторый я не могу обойти:

Traceback (most recent call last): File "<stdin>", line 1, in <module> File "C:\Python27\lib\site-packages\numpy\core\numeric.py", line 1682, in cross raise ValueError(msg) ValueError: incompatible dimensions for cross product (dimension must be 2 or 3)

1 Ответ

0 голосов
/ 29 октября 2019

Есть обходной путь с reshape и вещанием:

A = np.array([x_grid, y_grid, z_grid])
# A.shape == (3,5,5,5)

def B(v, p):
    '''
    v.shape = (3,)
    p.shape = (3,) 
    '''
    shape = A.shape

    Ap = A.reshape(3,-1) - p[:,None]

    return np.cross(v[None,:], Ap.reshape(3,-1).T).reshape(shape)

print(B(v,p).shape)
# (3, 5, 5, 5)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...