@user2818943的答案是好的,但是可以稍微优化一下:def divergence(F):
""" compute the divergence of n-D scalar field `F` """
return reduce(np.add,np.gradient(F))
时间:F = np.random.rand(100,100)
timeit reduce(np.add,np.gradient(F))
# 1000 loops, best of 3: 318 us per loop
timeit np.sum(np.gradient(F),axis=0)
# 100 loops, best of 3: 2.27 ms per loop
大约快7倍:
sum从np.gradient返回的渐变字段列表隐式构造一个3d数组。避免使用reduce
现在,在你的问题中,你所说的div[A * grad(F)]是什么意思?关于A * grad(F):A是二维数组,而grad(f)是二维数组的列表。所以我认为这意味着把每个梯度场乘以A。
关于将散度应用于(按A缩放的)梯度场,目前还不清楚。根据定义,div(F) = d(F)/dx + d(F)/dy + ...。我想这只是公式的错误。
对于1,可以将总和元素Bi乘以相同的因子A:Sum(A*Bi) = A*Sum(Bi)
因此,只需使用A*divergence(F)就可以得到这个加权梯度
如果̀A是一个因子列表,每个维度一个,那么解决方案是:def