Cómo eliminar columnas en numpy.array

Me gustaría eliminar las columnas seleccionadas en un numpy.array. Esto es lo que hago:

n [397]: a = array([[ NaN, 2., 3., NaN], .....: [ 1., 2., 3., 9]]) In [398]: print a [[ NaN 2. 3. NaN] [ 1. 2. 3. 9.]] In [399]: z = any(isnan(a), axis=0) In [400]: print z [ True False False True] In [401]: delete(a, z, axis = 1) Out[401]: array([[ 3., NaN], [ 3., 9.]]) 

En este ejemplo, mi objective es eliminar todas las columnas que contienen NaN. Espero que el último comando resulte en:

 array([[2., 3.], [2., 3.]]) 

¿Cómo puedo hacer eso?

Dado su nombre, creo que la forma estándar debería ser delete :

 import numpy as np A = np.delete(A, 1, 0) # delete second row of A B = np.delete(B, 2, 0) # delete third row of B C = np.delete(C, 1, 1) # delete second column of C 

De acuerdo con la página de documentación de numpy , los parámetros para numpy.delete son los siguientes:

numpy.delete(arr, obj, axis=None)

  • arr refiere a la matriz de entrada,
  • obj refiere a qué subarreglas (por ejemplo, número de columna / fila o segmento de la matriz) y
  • axis refiere a la operación de eliminación por columnas ( axis = 1 ) o por filas ( axis = 0 ).

Ejemplo de la documentación numpy :

 >>> a = numpy.array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11], [12, 13, 14, 15]]) >>> numpy.delete(a, numpy.s_[1:3], axis=0) # remove rows 1 and 2 array([[ 0, 1, 2, 3], [12, 13, 14, 15]]) >>> numpy.delete(a, numpy.s_[1:3], axis=1) # remove columns 1 and 2 array([[ 0, 3], [ 4, 7], [ 8, 11], [12, 15]]) 

Otra forma es usar matrices enmascaradas:

 import numpy as np a = np.array([[ np.nan, 2., 3., np.nan], [ 1., 2., 3., 9]]) print(a) # [[ NaN 2. 3. NaN] # [ 1. 2. 3. 9.]] 

El método np.ma.masked_invalid devuelve una matriz enmascarada con nans e infs enmascarados:

 print(np.ma.masked_invalid(a)) [[-- 2.0 3.0 --] [1.0 2.0 3.0 9.0]] 

El método np.ma.compress_cols devuelve una matriz 2-D con cualquier columna que contenga un valor enmascarado suprimido:

 a=np.ma.compress_cols(np.ma.masked_invalid(a)) print(a) # [[ 2. 3.] # [ 2. 3.]] 

Ver manipular una máscara enmascarada.

Esto crea otra matriz sin esas columnas:

  b = a.compress(logical_not(z), axis=1) 

De la documentación de Numpy

np.delete (arr, obj, axis = None) Devuelve una nueva matriz con subarreglas a lo largo de un eje eliminado.

 >>> arr array([[ 1, 2, 3, 4], [ 5, 6, 7, 8], [ 9, 10, 11, 12]]) >>> np.delete(arr, 1, 0) array([[ 1, 2, 3, 4], [ 9, 10, 11, 12]]) >>> np.delete(arr, np.s_[::2], 1) array([[ 2, 4], [ 6, 8], [10, 12]]) >>> np.delete(arr, [1,3,5], None) array([ 1, 3, 5, 7, 8, 9, 10, 11, 12]) 

En su situación, puede extraer los datos deseados con:

 a[:, -z] 

“-z” es la negación lógica de la matriz booleana “z”. Esto es lo mismo que:

 a[:, logical_not(z)] 
 >>> A = array([[ 1, 2, 3, 4], [ 5, 6, 7, 8], [ 9, 10, 11, 12]]) >>> A = A.transpose() >>> A = A[1:].transpose() 

Eliminando columnas de la matriz que contienen NaN. Esta es una respuesta larga, pero espero que sea fácil de seguir.

 def column_to_vector(matrix, i): return [row[i] for row in matrix] import numpy def remove_NaN_columns(matrix): import scipy import math from numpy import column_stack, vstack columns = A.shape[1] #print("columns", columns) result = [] skip_column = True for column in range(0, columns): vector = column_to_vector(A, column) skip_column = False for value in vector: # print(column, vector, value, math.isnan(value) ) if math.isnan(value): skip_column = True if skip_column == False: result.append(vector) return column_stack(result) ### test it A = vstack(([ float('NaN'), 2., 3., float('NaN')], [ 1., 2., 3., 9])) print("A shape", A.shape, "\n", A) B = remove_NaN_columns(A) print("B shape", B.shape, "\n", B) A shape (2, 4) [[ nan 2. 3. nan] [ 1. 2. 3. 9.]] B shape (2, 2) [[ 2. 3.] [ 2. 3.]]