我已经使用numpy meshgrid很长一段时间了,通常在尝试通过函数传递meshgrid时没有发现任何问题。在我的经验中,我总是可以将坐标空间定义为
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)时,代码可以很好地工作,但不能计算整个字段。我该如何解决这个问题呢?
发布于 2019-12-22 05:52:07
np.cross
只接受大小为3的向量,或者最后一维大小为3的nd数组,因此我们需要首先堆叠np.stack([x,y,z])
来创建10*10*10*3
nd数组。
结果将是一个10*10*10*3
数组,为了能够稍后解压该数组,我们需要转置它以调整3*10*10*10
的大小,因此我在最后交换了结果数组的轴。
在下面的代码中,假设wire_x, wire_y, wire_z
只是wire
的3个组件,我还随意地将代码wrt 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)
https://stackoverflow.com/questions/59441470
复制