【发布时间】:2017-12-18 02:20:36
【问题描述】:
我有一个计算一维 np.array 的有限差分的函数,我想推断一个 n-d 数组。
函数是这样的:
def fpp_fourth_order_term(U):
"""Returns the second derivative of fourth order term without the interval multiplier."""
# U-slices
fm2 = values[ :-4]
fm1 = values[1:-3]
fc0 = values[2:-2]
fp1 = values[3:-1]
fp2 = values[4: ]
return -fm2 + 16*(fm1+fp1) - 30*fc0 - fp2
它缺少 4 阶乘数 (1/(12*h**2)),但这没关系,因为我会在对术语进行分组时进行乘数。
我很想将其扩展为 N 维。为此,我将进行以下更改:
def fpp_fourth_order_term(U, axis=0):
"""Returns the second derivative of fourth order term along an axis without the interval multiplier."""
# U-slices
问题来了
fm2 = values[ :-4]
fm1 = values[1:-3]
fc0 = values[2:-2]
fp1 = values[3:-1]
fp2 = values[4: ]
这在 1D 中可以正常工作,如果是 2D 沿第一轴,例如我将不得不更改为:
fm2 = values[:-4,:]
fm1 = values[1:-3,:]
fc0 = values[2:-2,:]
fp1 = values[3:-1,:]
fp2 = values[4:,:]
但沿第二个轴将是:
fm2 = values[:,:-4]
fm1 = values[:,1:-3]
fc0 = values[:,2:-2]
fp1 = values[:,3:-1]
fp2 = values[:,4:]
这同样适用于 3d,但有 3 种可能性,并且一直持续下去。如果邻居设置正确,返回总是有效的。
return -fm2 + 16*(fm1+fp1) - 30*fc0 - fp2
当然axis 不能大于len(U.shape)-1(我把这个叫做维度,有没有办法提取这个sn-p?
我怎样才能为这个编码问题采取一种优雅和 Pythonic 的方法?
有没有更好的方法?
PS:关于np.diff 和np.gradient,它们不起作用,因为第一个是一阶,第二个是二阶,我正在做四阶近似。事实上,我很快就会完成这个问题,我也会概括这个顺序。但是,是的,我希望能够像np.gradient 那样在任何轴上做。
【问题讨论】:
-
slice模式不支持 fancy 索引作为U[:,1:-3]的另一种方式(np.take)模糊支持,我需要建立范围(因为range(1,-1)没有意义),np.take也复制数据(我想避免。但谢谢。我正在进步。 -
fc0 = values.take(indices=range(2, values.shape[axis]-2), axis=axis)之类的东西可以工作,但是复制数组 5 次会让我的记忆大打折扣。这些数组会变大。 :-/ -
实际上,简单有效的方法是在输入上使用
swapaxes将轴移动到最左边进行操作,然后在最终结果上再次使用swapaxes。 -
我已阅读
swapaxes,但不知道如何处理。
标签: python arrays numpy differential-equations