python - 从 Numpy Meshgrid 生成位置向量
问题描述
我将尝试在这里解释我的问题,而不会对实际应用程序进行太多详细说明,以便我们能够以代码为基础。基本上,我需要对向量场进行操作。我的第一步是将字段生成为
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)
解决方案
我认为您最初的尝试仅缺少应执行叉积的轴的规范。
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, axis=0)
我用下面的代码对此进行了测试。作为 的替代方法np.array([x, y, z])
,您还可以使用np.stack(x, y, z, axis=0)
,它清楚地显示网格网格沿哪个轴堆叠以形成矢量网格网格,矢量与轴 0 对齐。我还每次都打印形状并使用随机输入进行测试。在测试中,公式的输出在随机索引处与输入向量在与向量 v 相同索引处的叉积进行比较。
import numpy as np
x, y, z = np.meshgrid(np.linspace(-5, 5, 10), np.linspace(-5, 5, 10), np.linspace(-5, 5, 10))
p = np.random.rand(3) # random reference point
A = np.array([x-p[0], y-p[1], z-p[2]]) # vectors from positions to reference
A_bis = np.stack((x-p[0], y-p[1], z-p[2]), axis=0)
print(f"A equals A_bis? {np.allclose(A, A_bis)}") # the two methods of stacking yield the same
v = -1 + 2*np.random.rand(3) # random vector v
B = np.cross(v, A, axis=0) # cross-product for all points along correct axis
print(f"Shape of v: {v.shape}")
print(f"Shape of A: {A.shape}")
print(f"Shape of B: {B.shape}")
print("\nComparison for random locations: ")
point = np.random.randint(0, 9, 3) # generate random multi-index
a = A[:, point[0], point[1], point[2]] # look up input-vector corresponding to index
b = B[:, point[0], point[1], point[2]] # look up output-vector corresponding to index
print(f"A[:, {point[0]}, {point[1]}, {point[2]}] = {a}")
print(f"v = {v}")
print(f"Cross-product as v x a: {np.cross(v, a)}")
print(f"Cross-product from B (= v x A): {b}")
结果输出如下所示:
A equals A_bis? True
Shape of v: (3,)
Shape of A: (3, 10, 10, 10)
Shape of B: (3, 10, 10, 10)
Comparison for random locations:
A[:, 8, 1, 1] = [-4.03607312 3.72661831 -4.87453077]
v = [-0.90817859 0.10110274 -0.17848181]
Cross-product as v x a: [ 0.17230515 -3.70657882 -2.97637688]
Cross-product from B (= v x A): [ 0.17230515 -3.70657882 -2.97637688]
推荐阅读
- javascript - 无法将消息从 popup.js 发送到 chrome 扩展中的 content.js
- android - 我正在使用 iText 库在 android 中生成 pdf,表格是在 pdf 中创建的,现在我担心的是我不希望我的单元格文本内容多行
- regex - 想要创建正则表达式模式
- html - Html 换行 div 全宽
- scala - 使用 Spark 处理 txt 文件
- python-3.x - 如何理解 python 3 中的这种同时分配评估?
- c++ - 如何在 C++ 中查找上周一的日期
- java - Match on Options inside Tuple with Vavr
- c - To find the number of unique path in a matrix
- ios - How to make view the size of another view in SwiftUI