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