Tengo una matriz que podría tener este aspecto:

ANOVAInputMatrixValuesArray = [[ 0.96488889, 0.73641667, 0.67521429, 0.592875, 
0.53172222], [ 0.78008333, 0.5938125, 0.481, 0.39883333, 0.]]

Aviso de que una de las filas tiene un valor de cero al final. Quiero eliminar cualquier fila que contiene un cero, mientras que el mantenimiento de cualquier fila que contiene los valores distintos de cero en todas las células.

Pero la matriz se tienen diferentes números de filas cada vez que se llena, y los ceros se encuentra en filas diferentes cada vez.

Puedo obtener el número de no-cero de los elementos en cada fila con la siguiente línea de código:

NumNonzeroElementsInRows    = (ANOVAInputMatrixValuesArray != 0).sum(1)

Para la matriz anterior, NumNonzeroElementsInRows contiene: [5 4]

Los cinco indica que todos los valores posibles en la fila 0 son cero, mientras que el cuatro indica que uno de los posibles valores en la fila 1 es un cero.

Por lo tanto, estoy tratando de usar las siguientes líneas de código para encontrar y eliminar las 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 haciendo un montón de comandos de impresión indica que todas las variables parecen ser de rellenar correctamente conduce hasta el código.

Debe haber una manera fácil para que simplemente «eliminar cualquier fila que contiene el valor cero.»

¿Alguien puede mostrarme lo que código que se escribe para lograr esto?

InformationsquelleAutor MedicalMath | 2010-10-06

6 Comentarios

  1. 143

    La forma más sencilla de eliminar filas y columnas de las matrices es la numpy.delete método.

    Supongamos que tengo la siguiente matriz x:

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

    Para eliminar la primera fila, hacer esto:

    x = numpy.delete(x, (0), axis=0)

    Para eliminar la tercera columna, hacer esto:

    x = numpy.delete(x,(2), axis=1)

    Así que usted puede encontrar los índices de las filas que tienen un 0 en ellos, los puso en una lista o tupla y de pasar como segundo argumento de la función.

    • Gracias! Yo tenía el mismo problema, y yo no podía entender por qué simplemente llamando numpy.delete(x, index) no funciona.
    • tenga en cuenta que el numpy eliminar() docs indican que «a Menudo es preferible utilizar un valor booleano de la máscara», ya que una nueva matriz se volvió un ejemplo de ello es en virtud de ese vínculo
    • pero la máscara no es destructivo. Es una llamada a delete() tiempo/memoria consumir?
  2. 13

    Aquí un forro (sí, es similar a user333700, pero un poco más sencilla):

    >>> 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 enmascarado método de la matriz de matrices grandes. Para una 2048 x 5 matriz, este método trata de 1000x más rápido.

    Por el camino, user333700 del método (a partir de su comentario) fue ligeramente más rápido en mis pruebas, aunque se perturba mi mente ¿por qué.

    • «cualquiera» puede cortocircuito, tan pronto como el primer verdadero caso de que se detecte, se puede detener, mientras que «todo» tiene que verificar todas las condiciones. Por lo tanto, no («~» en numpy) ninguna, debe ser en general más rápido que todos.
    • ambos pueden corto-circuito, sólo para cosas diferentes. any corto-circuitos en true en el primer caso verdadero detectado; all corto-circuitos en falso en el primer caso falso detectado. En este caso, el cortocircuito debe ser un empate, pero haciendo el extra no debe hacer más lento en mi opinión.
  3. 5

    Esto es similar a su enfoque original, y se utiliza menos espacio que unutbu la respuesta, pero sospecho que va a 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 el camino, su línea de p.delete() no funciona para mí – ndarrays no tiene un .delete atributo.

    • un poco más simple: p[~(p==0).(1)] o más explícito para las filas: p[~(p==0).ninguna(1), :]
  4. 2

    numpy proporciona una función simple de hacer exactamente lo mismo:
    suponiendo que tienes una máscara de la matriz «a», llamando numpy.ma.compress_rows(a) eliminar las filas que contienen un enmascarado valor.
    Supongo que esto es mucho más rápido de esta manera…

  5. 1
    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[np.where(arr != 0.)])
  6. -1

    Podría ser demasiado tarde para responder a esta pregunta, pero quería compartir mi entrada para el beneficio de la comunidad. Para este ejemplo, deje que me llame a su matriz ‘ANOVA’, y estoy asumiendo que usted está tratando de eliminar las filas de esta matriz con 0 sólo en la 5ª 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]

Dejar respuesta

Please enter your comment!
Please enter your name here