2013-02-10 4 views
1

Quelle est la manière la plus simple/la plus rapide de prendre une somme pondérée de valeurs dans un tableau numpy?Somme pondérée des valeurs adjacentes dans le tableau numpy

Exemple: Résolution de l'équation de la chaleur avec la méthode d'Euler

length_l=10 
time_l=10 
u=zeros((length_l,length_l))# (x,y) 
u[:, 0]=1 
u[:,-1]=1 
print(u) 
def dStep(ALPHA=0.1): 
    for position,value in ndenumerate(u): 
     D2u= (u[position+(1,0)]-2*value+u[position+(-1, 0)])/(1**2) \ 
      +(u[position+(0,1)]-2*value+u[position+(0,-1)])/(1**2) 
     value+=ALPHA*D2u() 
while True: 
    dStep() 
    print(u) 

D2u devrait être la seconde différence centrale en deux dimensions. Cela fonctionnerait si je pouvais ajouter des index comme (1,4)+(1,3)=(2,7). Malheureusement, Python les ajoute comme (1,4)+(1,3)=(1,4,1,3).

Notez que le calcul du D2u équivaut à prendre un produit scalaire avec ce noyau centré autour de la position actuelle:

0, 1, 0 
1,-4, 1 
0, 1, 0 

peut-il être vectorisé comme un produit scalaire?

Répondre

3

Je pense que vous voulez quelque chose comme:

import numpy as np 
from scipy.ndimage import convolve 

length_l = 10 
time_l = 10 
u = np.zeros((length_l, length_l))# (x,y) 
u[:, 0] = 1 
u[:, -1] = 1 

alpha = .1 
weights = np.array([[ 0, 1, 0], 
        [ 1, -4, 1], 
        [ 0, 1, 0]]) 

for i in range(5): 
    u += alpha * convolve(u, weights) 
    print(u) 

Vous pouvez réduire un peu vers le bas en faisant:

weights = alpha * weights 
weights[1, 1] = weights[1, 1] + 1 

for i in range(5): 
    u = convolve(u, weights) 
    print(u) 
+0

Hmm ... Je reçois un 'ValueError: objet trop profond pour le tableau désiré ' – Navin

+0

Etes-vous sûr d'importer' convolve' de 'scipy.ndimage'? Je crois que j'ai déjà vu cette erreur avec la 1d-version de convolve. –

+0

Oui, passer à la version nd l'a corrigé. – Navin

Questions connexes