Supongamos que tengo una colección de matriz:

data = np.array([[1,1,1],[2,2,2],[3,3,3]])

y tengo un «correspondiente vector:»

vector = np.array([1,2,3])

¿Cómo puedo operar en data a lo largo de cada fila para restar o dividir por lo que el resultado es:

sub_result = [[0,0,0], [0,0,0], [0,0,0]]
div_result = [[1,1,1], [1,1,1], [1,1,1]]

Cortocircuito largo de la historia: ¿Cómo se realiza una operación sobre cada fila de una matriz 2D con una 1D array de escalares que corresponden a cada fila?

InformationsquelleAutor BFTM | 2013-10-26

5 Comentarios

  1. 150

    Aquí tienes. Usted sólo tiene que utilizar None (o, alternativamente,np.newaxis), combinada con la difusión:

    In [6]: data - vector[:,None]
    Out[6]:
    array([[0, 0, 0],
           [0, 0, 0],
           [0, 0, 0]])
    
    In [7]: data / vector[:,None]
    Out[7]:
    array([[1, 1, 1],
           [1, 1, 1],
           [1, 1, 1]])
  2. 10

    Como se ha mencionado, rebanar con None o con np.newaxes es una gran manera de hacer esto.
    Otra alternativa es el uso de transpone y radiodifusión, como en

    (data.T - vector).T

    y

    (data.T / vector).T

    De mayores dimensiones de las matrices puede que desee utilizar la swapaxes método de arrays de NumPy o la NumPy rollaxis función.
    Realmente hay un montón de maneras de hacer esto.

    Para una explicación más completa de la radiodifusión, ver
    http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html

  3. 1

    JoshAdel la solución de los usos de la np.newaxis para agregar una dimensión. Una alternativa es el uso de reformar() para alinear las dimensiones en preparación para la radiodifusión.

    data = np.array([[1,1,1],[2,2,2],[3,3,3]])
    vector = np.array([1,2,3])
    
    data
    # array([[1, 1, 1],
    #        [2, 2, 2],
    #        [3, 3, 3]])
    vector
    # array([1, 2, 3])
    
    data.shape
    # (3, 3)
    vector.shape
    # (3,)
    
    data / vector.reshape((3,1))
    # array([[1, 1, 1],
    #        [1, 1, 1],
    #        [1, 1, 1]])

    La realización de los reformar() permite que las dimensiones de la línea de radiodifusión:

    data:            3 x 3
    vector:              3
    vector reshaped: 3 x 1

    Nota que data/vector está bien, pero no obtener la respuesta que desea. Se divide cada columna de array (en lugar de cada fila) por cada elemento correspondiente de vector. Es lo que se obtendría si usted explícitamente reformado vector a ser 1x3 en lugar de 3x1.

    data / vector
    # array([[1, 0, 0],
    #        [2, 1, 0],
    #        [3, 1, 1]])
    data / vector.reshape((1,3))
    # array([[1, 0, 0],
    #        [2, 1, 0],
    #        [3, 1, 1]])
  4. 0

    Python manera de hacer esto es …

    np.divide(data,vector)

    Esto se hace cargo de la remodelación y también los resultados son en formato de punto flotante.
    En otras respuestas resultados son redondeadas formato de número entero.

    #NOTA: Ninguna de las columnas de datos y el vector debe coincidir con

  5. 0

    Añadir a la respuesta de stackoverflowuser2010, en el caso general, puede usar

    data = np.array([[1,1,1],[2,2,2],[3,3,3]])
    
    vector = np.array([1,2,3])
    
    data / vector.reshape(-1,1)

    Este a su vez su vector en una column matrix/vector. Permite hacer el elementwise operaciones como desee. Al menos para mí, esta es la manera más intuitiva que va sobre ella y ya (en la mayoría de los casos) numpy se acaba de utilizar una vista de la misma memoria interna para que la remodelación es eficiente demasiado.

Dejar respuesta

Please enter your comment!
Please enter your name here