2008-12-12 6 views
2

En utilisant NumPy, une matrice A a n lignes et m colonnes, et je veux ajouter un anneau de garde à la matrice A. Cette bague de garde est tout à zéro.Comment ajouter un anneau de garde à une matrice dans NumPy?

Que dois-je faire? Utilisez Reshape? Mais l'élément n'est pas suffisant pour faire une matrice n + 1 m + 1.

Ou etc.?

Merci d'avance

je veux dire un cycle supplémentaire de cellules qui contiennent toujours 0 matrice surround A.Basically il y a une chambre de matrice a n + 2rows m + 2columns où la première rangée et des colonnes et la dernière rangée et de colonnes sont tous nuls, et le reste sont les mêmes que la matrice A.

Répondre

6

sur votre suite à comment:

>>> import numpy 
>>> a = numpy.array(range(9)).reshape((3,3)) 
>>> b = numpy.zeros(tuple(s+2 for s in a.shape), a.dtype) 
>>> b[tuple(slice(1,-1) for s in a.shape)] = a 
>>> b 
array([[0, 0, 0, 0, 0], 
     [0, 0, 1, 2, 0], 
     [0, 3, 4, 5, 0], 
     [0, 6, 7, 8, 0], 
     [0, 0, 0, 0, 0]]) 
+0

Voulait mentionner que au moins avec la version de NumPy (1.2.0 version) et Python (2.5.2) J'ai, la conversion à tuple est inutile et il est apparu en omettant de gagner du temps dans mon propre limité essai. J'ai oublié que vous pourriez utiliser des tranches comme ça !! Python est comme le Feng Shui de la programmation. –

+0

Et en 'omettant' je veux dire en utilisant [] au lieu de tuple(). Oops :) –

5

C'est un moins grand mais plus facile à comprendre la version de Alex's answer:

>>> a = numpy.array(range(9)).reshape((3,3)) 
>>> a 
array([[0, 1, 2], 
     [3, 4, 5], 
     [6, 7, 8]]) 
>>> b = numpy.zeros(a.shape + numpy.array(2), a.dtype) 
>>> b 
array([[0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0]]) 
>>> b[1:-1,1:-1] = a 
>>> b 
array([[0, 0, 0, 0, 0], 
     [0, 0, 1, 2, 0], 
     [0, 3, 4, 5, 0], 
     [0, 6, 7, 8, 0], 
     [0, 0, 0, 0, 0]]) 
1

Cette question est ancienne maintenant, mais je veux juste alerter les gens qui trouvent que numpy has a function pad qui accomplit très facilement cela maintenant.

import numpy as np 
a = np.array(range(9)).reshape((3, 3)) 
a 
Out[15]: 
array([[0, 1, 2], 
     [3, 4, 5], 
     [6, 7, 8]]) 

a = np.pad(a, pad_width=((1,1),(1,1)), mode='constant', constant_values=0) 
a 
Out[16]: 
array([[0, 0, 0, 0, 0], 
     [0, 0, 1, 2, 0], 
     [0, 3, 4, 5, 0], 
     [0, 6, 7, 8, 0], 
     [0, 0, 0, 0, 0]]) 
Questions connexes