transponer tamaño suma multiplicar multiplicacion matriz matrices funcion arreglo arange python arrays numpy scipy

python - tamaño - Numpy: divide cada fila por un elemento vectorial



tamaño de un arreglo numpy (3)

Aqui tienes. Solo necesita usar None (o alternativamente np.newaxis ) combinado con broadcasting:

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]])

Supongamos que tengo una matriz numpy:

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

y tengo un "vector" correspondiente

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

¿Cómo opero los data 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]]

Para resumir: ¿Cómo realizo una operación en cada fila de una matriz 2D con una matriz 1D de escalares que corresponden a cada fila?


Como se ha mencionado, cortar con None o con np.newaxes es una excelente forma de hacerlo. Otra alternativa es usar transposiciones y radiodifusión, como en

(data.T - vector).T

y

(data.T / vector).T

Para arreglos dimensionales superiores, es posible que desee utilizar el método swapaxes de las matrices NumPy o la función rollaxis NumPy. Realmente hay muchas formas 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


La solución de JoshAdel usa np.newaxis para agregar una dimensión. Una alternativa es usar http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html .

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]])

Al realizar la remodelación (), las dimensiones se alinean para la transmisión:

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

Tenga en cuenta que data/vector está bien, pero no le proporciona la respuesta que desea. Divide cada columna de array (en lugar de cada fila ) por cada elemento correspondiente del vector . Es lo que obtendrías si configuraras explícitamente el vector para que sea de 1x3 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]])