Tengo una gran colección de matriz que necesito para manipular de forma que cada elemento se cambia a un 1 o un 0 si se cumple una condición (será utilizado como un píxel de la máscara más adelante). Hay alrededor de 8 millones de elementos en la matriz y mi actual método de toma demasiado tiempo para la reducción de la tubería:

for (y,x), value in numpy.ndenumerate(mask_data): 

    if mask_data[y,x]<3: #Good Pixel
        mask_data[y,x]=1
    elif mask_data[y,x]>3: #Bad Pixel
        mask_data[y,x]=0

Hay una colección función que podría acelerar este proceso?

  • ¿Qué desea que suceda si mask_data[y,x]==3?
  • Buen punto, que todavía sería un pixel malo. Voy a cambiar la condición para if mask_data[y,x]>=3:
InformationsquelleAutor ChrisFro | 2013-11-04

5 Comentarios

  1. 102
    >>> import numpy as np
    >>> a = np.random.randint(0, 5, size=(5, 4))
    >>> a
    array([[4, 2, 1, 1],
           [3, 0, 1, 2],
           [2, 0, 1, 1],
           [4, 0, 2, 3],
           [0, 0, 0, 2]])
    >>> b = a < 3
    >>> b
    array([[False,  True,  True,  True],
           [False,  True,  True,  True],
           [ True,  True,  True,  True],
           [False,  True,  True, False],
           [ True,  True,  True,  True]], dtype=bool)
    >>> 
    >>> c = b.astype(int)
    >>> c
    array([[0, 1, 1, 1],
           [0, 1, 1, 1],
           [1, 1, 1, 1],
           [0, 1, 1, 0],
           [1, 1, 1, 1]])

    Puede acortar con esto:

    >>> c = (a < 3).astype(int)
    • cómo hacer que esto suceda con columnas específicas, sin rebanar a cabo algunas de las columnas y, a continuación, asignar de nuevo? por ejemplo, sólo los elementos en las columnas [2, 3]. si el valor de cambio cuando las condiciones se cumplen, mientras que otras columnas no va a cambiar, no importa las condiciones se cumplen o no.
  2. 63
    >>> a = np.random.randint(0, 5, size=(5, 4))
    >>> a
    array([[0, 3, 3, 2],
           [4, 1, 1, 2],
           [3, 4, 2, 4],
           [2, 4, 3, 0],
           [1, 2, 3, 4]])
    >>> 
    >>> a[a > 3] = -101
    >>> a
    array([[   0,    3,    3,    2],
           [-101,    1,    1,    2],
           [   3, -101,    2, -101],
           [   2, -101,    3,    0],
           [   1,    2,    3, -101]])
    >>>

    Ver, por ejemplo, La indización con matrices booleanas.

    • excelente material, gracias! Si usted desea consultar el valor de cambio que se puede usar algo como a[a > 3] = -101+a[a > 3].
    • Aunque si a[a > 3] = -101+a[a > 3] en lugar de a[a > 3] += -101 lo más probable es que la cara de salida de la memoria.
    • ¿cómo se refieren al valor de cambio como pexmar pedido??
  3. 29

    La rápida y más flexible) en el camino de es el uso de np.donde, que elige entre dos matrices de acuerdo a una máscara(matriz de valores true y false):

    import numpy as np
    a = np.random.randint(0, 5, size=(5, 4))
    b = np.where(a<3,0,1)
    print('a:',a)
    print()
    print('b:',b)

    que se producen:

    a: [[1 4 0 1]
     [1 3 2 4]
     [1 0 2 1]
     [3 1 0 0]
     [1 4 0 1]]
    
    b: [[0 1 0 0]
     [0 1 0 1]
     [0 0 0 0]
     [1 0 0 0]
     [0 1 0 0]]
  4. 3

    Usted puede crear su máscara de matriz en un paso como este

    mask_data = input_mask_data < 3

    Esto crea un arreglo booleano que se puede utilizar como un píxel de la máscara. Tenga en cuenta que nosotros no hemos cambiado la matriz de entrada (como en el código), sino que han creado una nueva matriz para mantener la máscara de datos – yo recomendaría hacerlo de esta manera.

    >>> input_mask_data = np.random.randint(0, 5, (3, 4))
    >>> input_mask_data
    array([[1, 3, 4, 0],
           [4, 1, 2, 2],
           [1, 2, 3, 0]])
    >>> mask_data = input_mask_data < 3
    >>> mask_data
    array([[ True, False, False,  True],
           [False,  True,  True,  True],
           [ True,  True, False,  True]], dtype=bool)
    >>> 
    • Yep. Si el OP realmente quiere 0s y 1s, él podría utilizar .astype(int) o *1, sino un array de True y False es tan bueno como es.
  5. -2

    No estoy seguro de que he entendido tu pregunta, pero si usted escribe:

    mask_data[:3, :3] = 1
    mask_data[3:, 3:] = 0

    Esto hará que todos los valores de la máscara de datos cuyos x e y los índices son de menos de 3 a ser igual a 1 y todo el resto a ser igual a 0

Dejar respuesta

Please enter your comment!
Please enter your name here