使用 numpy meshgrid 计算网格计算

Computing grid computations using numpy meshgrid

我使用 numpy meshgrids 已经很长时间了,在尝试通过函数传递该 meshgrid 时通常没有发现任何问题。根据我的经验,我总是可以将坐标 space 定义为

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

然后可以很容易地计算出类似的东西 u,v,w = numpy.sin(x*y)+numpy.cos(z).

我的问题是因为需要在该计算中进行叉积。我正在使用 meshgrid 定义一个字段,并尝试通过函数传递整个 meshgrid:

field_equation = lambda x,y,z: sum([parameter*np.cross([wire_x[i],wire_y[i],wire_z[i]],[x,y,z]) for i in range(len(wire))])

根据我尝试解决问题的方式,我遇到了一大堆问题。当一次通过一个单独的点 (x,y,z) 时,该代码工作正常,但无法计算整个字段。我该如何解决这个问题?

np.cross 只接受大小为 3 的向量,或最后一维大小为 3 的 nd 数组,因此我们需要堆叠 np.stack([x,y,z]) 以创建一个 10*10*10*3 nd-数组优先。

结果将是一个 10*10*10*3 数组,为了稍后能够解压这个数组,我们需要将它转置为大小 3*10*10*10,所以我在最后交换结果数组的轴.

在下面的代码中,我还冒昧地缩短了 wire 的代码,假设 wire_x, wire_y, wire_z 只是 wire 的 3 个组件。

import numpy as np

# test data
x,y,z = np.meshgrid(np.linspace(-10,10,10),
                    np.linspace(-10,10,10),
                    np.linspace(-10,10,10))

wire = [[1,2,3,4], [5,6,7,8], [3,4,5,6]]
parameter = 1

field_equation = lambda x,y,z: sum([parameter*np.cross(w, np.stack([x,y,z], axis=-1)) for w in zip(*wire)]).swapaxes(0,-1)

a,b,c = field_equation(x,y,z)
print(a.shape, b.shape, c.shape)

#(10, 10, 10) (10, 10, 10) (10, 10, 10)