2016-07-01 2 views
2

J'essaie d'utiliser l'indexation avancée pour modifier une grande matrice éparse. Disons que vous avez le code suivant:modification de la matrice fragmentée en utilisant l'indexation avancée en python

import numpy as np 
import scipy.sparse as sp 

A = sp.lil_matrix((10, 10)) 
a = np.array([[1,2],[3,4]]) 

idx = [1,4] 
A[idx, idx] += a 

Pourquoi ce code ne fonctionne pas? Il me donne l'erreur

ValueError: shape mismatch in assignment 
+0

Avec un réseau dense, la même opération a le même problème, bien que le message d'erreur est: 'ValueError: non diffusable l'opérande de sortie avec la forme (2,) ne correspond pas à la forme de diffusion (2,2) '. Essayez-vous de définir une diagonale, ou un carré de valeurs? – hpaulj

+0

J'essayais de définir une sous-matrice de A avec les valeurs de a. – aaragon

Répondre

2

Pour idx = [1,4], A[idx, idx] retourne une matrice creuse de forme (1,2) avec les éléments A[1,1] et A[4,4]. Cependant, a a la forme (2,2). Par conséquent, il y a une discordance de forme. Si vous souhaitez affecter A[1,1], A[1,4], A[4,1] et A[4,4]-a, vous devez faire:

import numpy as np 
import scipy.sparse as sp 

A = sp.lil_matrix((10, 10)) 
a = np.array([[1,2],[3,4]]) 

idx = np.array([1,4]) 
A[idx[:, np.newaxis], idx] += a # use broadcasting