2012-06-20 10 views
6

Tengo una matriz de 800x800 y quiero analizar solo los elementos en la parte externa de la misma. Necesito una nueva matriz sin los elementos de la porción [5: -5,5: -5]. No necesariamente tiene que devolver una matriz 2d, una matriz plana o una lista también lo hará. Ejemplo:¿Cómo eliminar un subconjunto de matrices 2d?

import numpy 

>>> a = numpy.arange(1,10) 
array([1, 2, 3, 4, 5, 6, 7, 8, 9]) 

>>> a.shape = (3,3) 
array([[1, 2, 3], 
    [4, 5, 6], 
    [7, 8, 9]]) 

necesito para descartar los elementos centrales, algo así como:

del a[1:2,1:2] 

espero tener:

array([1, 2, 3, 4, 6, 7, 8, 9]) 

He intentado utilizar numpy.delete(), pero parece funcionar para un eje a la vez. Me pregunto si hay una forma más directa de hacerlo.

Respuesta

2

Puede reemplazar la región media con un valor de marcador de posición (utilicé -12.345, algo que no puede ocurrir en los datos reales funcionaría), a continuación, seleccione todo lo que no es igual a ese valor:

>>> import numpy as np 
>>> a = np.arange(1,26) 
>>> a.shape = (5,5) 
>>> a 
array([[ 1, 2, 3, 4, 5], 
     [ 6, 7, 8, 9, 10], 
     [11, 12, 13, 14, 15], 
     [16, 17, 18, 19, 20], 
     [21, 22, 23, 24, 25]]) 

>>> a[1:4,1:4] = -12345 
>>> a 
array([[  1,  2,  3,  4,  5], 
     [  6, -12345, -12345, -12345,  10], 
     [ 11, -12345, -12345, -12345,  15], 
     [ 16, -12345, -12345, -12345,  20], 
     [ 21,  22,  23,  24,  25]]) 
>>> a[a != -12345] 
array([ 1, 2, 3, 4, 5, 6, 10, 11, 15, 16, 20, 21, 22, 23, 24, 25]) 

Si utiliza una red de flotadores en lugar de una matriz de enteros, puede hacerlo un poco más elegante mediante el uso de NaN y isfinite:

>>> a = np.arange(1,26).astype('float32') 
>>> a.shape = (5,5) 
>>> a[1:4,1:4] = np.nan 
>>> a 
array([[ 1., 2., 3., 4., 5.], 
     [ 6., nan, nan, nan, 10.], 
     [ 11., nan, nan, nan, 15.], 
     [ 16., nan, nan, nan, 20.], 
     [ 21., 22., 23., 24., 25.]], dtype=float32) 
>>> a[np.isfinite(a)] 
array([ 1., 2., 3., 4., 5., 6., 10., 11., 15., 16., 20., 
    21., 22., 23., 24., 25.], dtype=float32) 
6

se puede utilizar una matriz booleana para indexar su conjunto como quieras. De esta forma, no tiene que cambiar ningún valor en su matriz original si no lo desea. Aquí está un ejemplo sencillo:

>>> import numpy as np 
>>> a = np.arange(1,10).reshape(3,3) 
>>> b = a.astype(bool) 
>>> b[1:2,1:2] = False 
>>> b 
array([[ True, True, True], 
     [ True, False, True], 
     [ True, True, True]], dtype=bool) 
>>> a[b] 
array([1, 2, 3, 4, 6, 7, 8, 9]) 
+0

gran elección porque no tiene que modificar gama de originales y no hay necesidad de conocer el contenido de la matriz – user1470350

+0

@ user1470350 - Sí, es una buena manera de hacer las cosas :) – fraxel

Cuestiones relacionadas