使用numpy meshgrid计算网格计算

问题描述 投票:0回答:1

我已经使用了numpy网格物体很长时间了,通常在尝试通过功能传递该网格物体时没有发现任何问题。根据我的经验,总是可以将坐标空间定义为

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)传递一次时,该代码运行良好,但无法计算整个字段。我该如何解决?

python arrays numpy simulation
1个回答
0
投票

[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的3个组成部分,将wire的代码稍微缩短了。

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)
© www.soinside.com 2019 - 2024. All rights reserved.