2010-12-15 51 views
4

Je ne suis pas sûr de savoir comment mettre à l'échelle un tableau bidimensionnel. Compte tenu du tableau ci-dessous, dont les dimensions sont 8x10, disons que je devais l'adapter à 5x6 - j'ai cherché des exemples concrets sur wikipedia, mais sans beaucoup de fondement dans les mathématiques matricielles, je suis un peu perdu. Si quelqu'un pouvait me diriger dans la bonne direction, j'apprécierais vraiment!Comment j'élèverais un tableau bidimensionnel en python?

[ 
[0, 0, 1, 1, 1, 1, 0, 0], 
[0, 1, 1, 1, 1, 1, 1, 0], 
[0, 1, 0, 0, 0, 1, 1, 1], 
[0, 0, 0, 0, 0, 0, 1, 1], 
[0, 0, 1, 1, 1, 1, 1, 1], 
[1, 1, 1, 1, 1, 1, 1, 1], 
[1, 1, 0, 0, 0, 0, 1, 1], 
[1, 1, 0, 0, 0, 1, 1, 1], 
[1, 1, 1, 1, 1, 1, 1, 1], 
[0, 1, 1, 1, 1, 0, 1, 1] 
] 
+2

Quand vous dites échelle, que voulez-vous dire exactement? Traitez-le comme une image? – configurator

+0

La mise à l'échelle a une signification spécifique en ce qui concerne les matrices (à savoir, c'est une transformation affine particulière), qui ne change pas la taille de la matrice. Donc je suppose que vous faites référence à quelque chose d'autre ici, mais ce n'est pas clair ce que c'est. –

+0

Yah, traite-le comme une image. Je pense que c'est là que mes problèmes ont trouvé une solution parce que la transformation de la matrice semble être un peu différente. Je voudrais "préserver" dans un certain sens les données contenues à l'intérieur tout en réduisant ou en augmentant arbitrairement – coleifer

Répondre

8

Comme votre tableau ressemble à une image binaire d'une lettre minuscule 'a', je suppose que vous voulez dire échelle au sens de l'image.

Pour ce faire, je recommande d'utiliser la fonction imresize dans scipy.misc (qui provient de PIL, je crois). Voici un exemple:

import numpy as np 
from scipy.misc import imresize 

img = np.array([ 
[0, 0, 1, 1, 1, 1, 0, 0], 
[0, 1, 1, 1, 1, 1, 1, 0], 
[0, 1, 0, 0, 0, 1, 1, 1], 
[0, 0, 0, 0, 0, 0, 1, 1], 
[0, 0, 1, 1, 1, 1, 1, 1], 
[1, 1, 1, 1, 1, 1, 1, 1], 
[1, 1, 0, 0, 0, 0, 1, 1], 
[1, 1, 0, 0, 0, 1, 1, 1], 
[1, 1, 1, 1, 1, 1, 1, 1], 
[0, 1, 1, 1, 1, 0, 1, 1] 
]) 
newimg = imresize(img, (6,5)) 

et newimg est alors

array([[ 0, 0, 255, 255, 0], 
     [ 0, 255, 255, 255, 255], 
     [ 0, 0, 0, 0, 255], 
     [255, 255, 255, 255, 255], 
     [255, 255, 0, 0, 255], 
     [255, 255, 255, 255, 255]], dtype=uint8) 

qui est pas parfait, mais vous pouvez changer les 255 de 1 assez de facilement. En outre, si vous obtenez la version de développement de Scipy, actuellement la version 9, alors vous avez some other parameters (faites défiler vers le bas pour imresize - pas d'ancre) que vous pouvez entrer pour imresize comme la méthode d'interpolation et le mode PIL.

+0

Pourquoi utiliser scipy quand il suffit d'utiliser PIL a plus de sens? – martineau

+0

Wow, je pensais que ce serait un hack d'utiliser directement PIL, mais c'est peut-être la meilleure façon d'aller – coleifer

+0

@martineau, peut-être parce que vous voulez utiliser le résultat dans scipy? C'était ma pensée de toute façon. –

2

En cas de doute, utilisez une bibliothèque!

PIL a des fonctions pour redimensionner des images, en supposant que c'est le genre de mise à l'échelle que vous recherchez. Pour convertir votre liste de listes en une image PIL, commencez par la convertir en un tableau numpy, then to PIL format. Une fois que vous avez terminé, vous pouvez inverser le processus pour obtenir une liste de listes à nouveau (si vous voulez vraiment).