使用 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)
我使用 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)