Python,在numpy.array中的每个元素上应用公式

时间:2016-03-28 18:46:19

标签: python arrays numpy

好吧,所以这就是我想要做的事情。

让我说我对函数的输入是(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])

的变化

我不知道如何将这些结合到函数中。

感谢您的帮助!

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()