【发布时间】:2015-01-20 06:01:07
【问题描述】:
我有一个函数calcField,当给定一个包含两个元素表示一个位置的 numpy 数组时,它返回一个表示该位置电场的数组。要求 matplotlib 为该函数绘制矢量场的最 Pythonic 方式是什么?目前我有这段代码工作,但感觉与 numpy 的精神背道而驰,并且相对不可读。
Y, X = np.mgrid[-3:3:100j, -3:3:100j]
vectors = np.array([[field.calcField(r) for r in row]
for row in [zip(a, b) for a, b in zip(X, Y)]])
U = np.array([[vector[0] for vector in row] for row in vectors])
V = np.array([[vector[1] for vector in row] for row in vectors])
plt.streamplot(X, Y, U, V, color=U, linewidth=2, cmap=plt.cm.autumn)
编辑:根据要求,calcField的代码:
import constants
import numpy as np
import numpy.linalg as l
class Field:
def __init__(self, charges = []):
self.charges = charges
def addCharge(self, charge):
self.charges = self.charges + [charge]
def calcField(self, point):
point = np.array(point)
return sum([charge.calcField(point) for charge in self.charges])
class PointCharge:
def __init__(self, q, position):
self.q = q
self.position = np.array(position)
def calcField(self, point):
return constants.k * self.q * (point - self.position) / l.norm (point - self.position)**3
【问题讨论】:
-
尝试矢量化函数
calcField。一旦掌握了这一点,您就可以摆脱这段代码摘录中的所有其他 for 循环。 -
补充 Oliver 所说的内容,您可以写
U,V = calcField(X,Y)。只有在值得付出努力的情况下才这样做,即这段代码很慢,或者你知道你将来会经常使用calcField()。 -
我已经养成了将 N 空间中的向量表示为长度为 N 的 numpy 数组的习惯,因此我可以只处理向量运算,而不是跟踪单个组件。例如,点电荷字段的表达式就是
k*q*(pos1 - pos2)/np.linalg.norm(pos1 - pos2)**3。有没有办法在一次对多个输入进行操作的意义上“矢量化”时保持数学的这种可读性? -
我们可以看看
calcField吗?
标签: python numpy matplotlib