好吧,所以这就是我想要做的事情。
让我说我对函数的输入是(D,y) Y是数组中的元素数,因此如果Y为3,则数组为([1,2,3])如果为51,则数组为([1,2,3 .... 51])。 所以我正在为此做的是
def okay(D,y):
T=np.arange(y)
我想要应用于数组的等式是以下
k = D *(T [k + 1] -T [k])+ D *(T [k-1] -T [k])
因此,k是T数组中的任何索引,D是函数开头指定的值。
所以,基本上发生的是,操作后数组中任何元素的新值是D *([前面的元素] - [元素本身])+ D *([元素]在它之前] - [元素本身])
所以,这通常看起来很简单。通过指定每个索引
,我能够在一个简单的数组上完成它d=3
T=np.array([23,17,46,2])
T[1] = d*(T[2]-T[1])+d*(T[0]-T[1])
print(T)
但是,每当我尝试为区域中的每个元素创建一个函数时,我的问题就出现了。我无法弄清楚如何设置k方面,使得函数理解我的意思是数组中的任何点。因此,如果我有一个包含5000个值的数组,它将使用索引本身以及它后面的那个值对每个值进行操作。
我尝试使用int和i以及“for T in element”,但它让我永远不会错过错误。
其次,函数应该为端点做一个不同的等式,因为它们之前或之后没有任何值:
T [0] = D *(T [1] -T [0])
的变化T [L-1] = D *(T [L-2] -T [L-1])
的变化我不知道如何将这些结合到函数中。
感谢您的帮助!
答案 0 :(得分:0)
你有意改变T
吗?那么一个值取决于上一步中修改过的T
?或者每个步骤是独立的吗?
让我们假设后者,因为它更简单。在这种情况下,我认为,我们计算:
In [528]: T = np.arange(10)
In [529]: R = np.zeros(10)
In [533]: for i in range(10):
if i==0:
R[i]=3*(T[i+1]-T[i])
elif i==9:
R[i]=2*(T[i-1]-T[i])
else:
R[i]=3*(T[i+1]-T[i])+2*(T[i-1]-T[i])
.....:
In [534]: R
Out[534]: array([ 3., 1., 1., 1., 1., 1., 1., 1., 1., -2.])
由于T
均匀分布,因此中间值不是很有趣;我们现在就住它。
可以使用切片计算中间值:
In [535]: 3*(T[2:]-T[1:-1])+2*(T[:-2]-T[1:-1])
Out[535]: array([1, 1, 1, 1, 1, 1, 1, 1])
In [536]: R[1:-1]=3*(T[2:]-T[1:-1])+2*(T[:-2]-T[1:-1])
In [537]: R
Out[537]: array([ 3., 1., 1., 1., 1., 1., 1., 1., 1., -2.])
或者我们也可以通过以下方式获得最终值:
In [542]: R = np.zeros(10)
In [543]: R[:-1] += 3*(T[1:]-T[:-1])
In [544]: R[1:] += 2*(T[:-1]-T[1:])
In [545]: R
Out[545]: array([ 3., 1., 1., 1., 1., 1., 1., 1., 1., -2.])
现在,如果R[i-1]
进入R[i]
的计算,我们将不得不重新考虑矢量化计算:
In [546]: R = T.copy()
In [547]: for i in range(10):
if i==0:
R[i]=3*(T[i+1]-T[i])
elif i==9:
R[i]=2*(R[i-1]-T[i])
else:
R[i]=3*(T[i+1]-T[i])+2*(R[i-1]-T[i])
.....:
In [548]: R
Out[548]: array([ 3, 7, 13, 23, 41, 75, 141, 271, 529, 1040])
有一些可能有用的累积函数和无缓冲计算
np.cumsum()
np.add.at()