python - una - borrar filas en numpy array
transpuesta de una matriz en python numpy (5)
Aquí hay un trazador de líneas (sí, es similar al user333700, pero un poco más sencillo):
>>> import numpy as np
>>> arr = np.array([[ 0.96488889, 0.73641667, 0.67521429, 0.592875, 0.53172222],
[ 0.78008333, 0.5938125, 0.481, 0.39883333, 0.]])
>>> print arr[arr.all(1)]
array([[ 0.96488889, 0.73641667, 0.67521429, 0.592875 , 0.53172222]])
Por cierto, este método es mucho, mucho más rápido que el método de matriz enmascarada para matrices grandes. Para una matriz de 2048 x 5, este método es aproximadamente 1000 veces más rápido.
Por cierto, el método de user333700 (de su comentario) fue un poco más rápido en mis pruebas, aunque me desconcierta por qué.
Tengo una matriz que podría verse así:
ANOVAInputMatrixValuesArray = [[ 0.96488889, 0.73641667, 0.67521429, 0.592875,
0.53172222], [ 0.78008333, 0.5938125, 0.481, 0.39883333, 0.]]
Tenga en cuenta que una de las filas tiene un valor cero al final. Quiero eliminar cualquier fila que contenga un cero, mientras mantengo cualquier fila que contenga valores distintos de cero en todas las celdas.
Pero la matriz tendrá diferentes números de filas cada vez que se rellene, y los ceros se ubicarán en filas diferentes cada vez.
Obtengo la cantidad de elementos distintos de cero en cada fila con la siguiente línea de código:
NumNonzeroElementsInRows = (ANOVAInputMatrixValuesArray != 0).sum(1)
Para la matriz anterior, NumNonzeroElementsInRows
contiene: [5 4]
El cinco indica que todos los valores posibles en la fila 0 son distintos de cero, mientras que los cuatro indican que uno de los valores posibles en la fila 1 es cero.
Por lo tanto, estoy tratando de utilizar las siguientes líneas de código para buscar y eliminar filas que contienen valores cero.
for q in range(len(NumNonzeroElementsInRows)):
if NumNonzeroElementsInRows[q] < NumNonzeroElementsInRows.max():
p.delete(ANOVAInputMatrixValuesArray, q, axis=0)
Pero, por alguna razón, este código no parece hacer nada, aunque hacer muchos comandos de impresión indica que todas las variables parecen estar llenando correctamente antes del código.
Debe haber alguna forma sencilla de "eliminar cualquier fila que contenga un valor cero".
¿Alguien puede mostrarme qué código escribir para lograr esto?
Esto es similar a su enfoque original, y usará menos espacio que la respuesta de unutbu , pero sospecho que será más lento.
>>> import numpy as np
>>> p = np.array([[1.5, 0], [1.4,1.5], [1.6, 0], [1.7, 1.8]])
>>> p
array([[ 1.5, 0. ],
[ 1.4, 1.5],
[ 1.6, 0. ],
[ 1.7, 1.8]])
>>> nz = (p == 0).sum(1)
>>> q = p[nz == 0, :]
>>> q
array([[ 1.4, 1.5],
[ 1.7, 1.8]])
Por cierto, su línea p.delete()
no funciona para mí, los ndarray
s no tienen un atributo .delete
.
La forma más sencilla de eliminar filas y columnas de matrices es el método numpy.delete
.
Supongamos que tengo la siguiente matriz x
:
x = array([[1,2,3],
[4,5,6],
[7,8,9]])
Para eliminar la primera fila, haz esto:
x = numpy.delete(x, (0), axis=0)
Para eliminar la tercera columna, haz esto:
x = numpy.delete(x,(2), axis=1)
De modo que podría encontrar los índices de las filas que tienen un 0 en ellos, ponerlos en una lista o una tupla y pasarlo como el segundo argumento de la función.
Puede que sea demasiado tarde para responder a esta pregunta, pero quería compartir mi opinión para el beneficio de la comunidad. Para este ejemplo, permítame llamar a su matriz ''ANOVA'', y supongo que solo está tratando de eliminar filas de esta matriz con 0 solo en la quinta columna.
indx = []
for i in range(len(ANOVA)):
if int(ANOVA[i,4]) == int(0):
indx.append(i)
ANOVA = [x for x in ANOVA if not x in indx]
numpy proporciona una función simple para hacer exactamente lo mismo: suponiendo que tiene una matriz enmascarada ''a'', al llamar a numpy.ma.compress_rows (a) se eliminarán las filas que contienen un valor enmascarado. Supongo que esto es mucho más rápido de esta manera ...