我将尝试在这里解释我的问题,而不会详细介绍实际应用程序,以便我们能够立足于代码。基本上,我需要对向量场进行运算。我的第一步是将字段生成为
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)
.
不幸的是,这种情况需要更困难的操作。我需要使用类似于的公式
其中向量 r 在程序中定义为 np.array([xgrid-x,ygrid-y,zgrid-z])
除以它自己的规范。基本上,这是一个从空间中的每个点指向位置 (x,y,z) 的向量
现在 Numpy 已经使用 np.cross()
实现了叉积函数,但我似乎无法创建我需要的“矢量网格”。
我有一个 lambda 函数,本质上是
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)
最佳答案
有一个解决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)
关于python - 从 Numpy Meshgrid 生成位置向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58591620/