Python中的“动态”N维有限差异

我有一个函数来计算1d np.array的有限差分,我想外推到一个n-d数组。Python中的“动态”N维有限差异

功能是这样的:

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

它缺少四阶乘数(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大(我把这个尺寸,有没有什么办法,而不是提取该段?

我如何做这个编码问题一个优雅和Python的方法呢?

有没有更好的方式来做到这一点

PS:关于np.diffnp.gradient,那些没有工作,因为第一个是一阶,第二个我我做了第四阶近似。事实上,我很快就完成了这个问题,我也将推广这个命令。但是,是的,我希望能够在任何轴上做np.gradient

回答:

一个简单而有效的解决方案是,在开始和结束你的程序的使用swapaxes

import numpy as np 

def f(values, axis=-1):

values = values.swapaxes(0, axis)

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).swapaxes(0, axis)

a = (np.arange(4*7*8)**3).reshape(4,7,8)

res = f(a, axis=1)

print(res)

print(res.flags)

输出:

# [[[ 73728 78336 82944 87552 92160 96768 101376 105984] 

# [110592 115200 119808 124416 129024 133632 138240 142848]

# [147456 152064 156672 161280 165888 170496 175104 179712]]

# [[331776 336384 340992 345600 350208 354816 359424 364032]

# [368640 373248 377856 382464 387072 391680 396288 400896]

# [405504 410112 414720 419328 423936 428544 433152 437760]]

# [[589824 594432 599040 603648 608256 612864 617472 622080]

# [626688 631296 635904 640512 645120 649728 654336 658944]

# [663552 668160 672768 677376 681984 686592 691200 695808]]

# [[847872 852480 857088 861696 866304 870912 875520 880128]

# [884736 889344 893952 898560 903168 907776 912384 916992]

# [921600 926208 930816 935424 940032 944640 949248 953856]]]

其结果是,即使是连续的。

# C_CONTIGUOUS : True 

# F_CONTIGUOUS : False

# OWNDATA : False

# WRITEABLE : True

# ALIGNED : True

# UPDATEIFCOPY : False

以上是 Python中的“动态”N维有限差异 的全部内容, 来源链接: utcz.com/qa/260530.html

回到顶部