J'ai un scipy.sparse.dok_matrix
(dimensions mx n), voulant ajouter un tableau entier avec une longueur m.Ajout d'un tableau numpy à un scipy.sparse.dok_matrix
for col in xrange(n):
dense_array = ...
dok_matrix[:,col] = dense_array
Cependant, ce code soulève une exception dans dok_matrix.__setitem__
quand il tente de supprimer une clé non existante (del self[(i,j)]
).
Donc, pour l'instant je fais cela la façon unelegant:
for col in xrange(n):
dense_array = ...
for row in dense_array.nonzero():
dok_matrix[row, col] = dense_array[row]
Ce sent très ineffecient. Alors, quel est le moyen le plus efficace de le faire?
Merci!
La façon « unelegant » filtre les zéros avec 'dense_array.nonzeros()' avant d'insérer des valeurs dans dok_matrix, c'est pourquoi il ne tombe pas en panne. Merci beaucoup! – PhilS
Doh, raté ça, mais content de pouvoir aider. –
side-note: Je pense que le code indiqué ci-dessus dans 'dok.py' est bogué, car les valeurs zéro sont définies dans' dok_matrix' si la clé (i, j) n'existe pas encore. J'ai ouvert un ticket (http://projects.scipy.org/scipy/ticket/1160). De plus, mon comportement "unelegant" fonctionne beaucoup mieux si 'dense_array' est clairsemé, car seules les valeurs non nulles doivent être vérifiées et insérées (' __setitem__' ne leur est demandé). Donc, je m'en tiens à mon ancienne version, bien que celle que vous avez mentionnée soit plus belle ... – PhilS