Suponha que eu tenha uma matriz numpy:
data = np.array([[1,1,1],[2,2,2],[3,3,3]])
e eu tenho um "vetor:" correspondente
vector = np.array([1,2,3])
Como opero ao data
longo de cada linha para subtrair ou dividir para que o resultado seja:
sub_result = [[0,0,0], [0,0,0], [0,0,0]]
div_result = [[1,1,1], [1,1,1], [1,1,1]]
Resumindo: como faço para executar uma operação em cada linha de um array 2D com um array 1D de escalares que correspondem a cada linha?
None
ainda funciona de forma equivalente aonp.newaxis
. Não tenho certeza de qual é a sua configuração ou do problema exato que você está enfrentando, mas a resposta ainda é válida.Como já foi mencionado, fatiar com
None
ou comnp.newaxes
é uma ótima maneira de fazer isso. Outra alternativa é usar transposes e broadcasting, como eme
Para matrizes de dimensões mais altas, você pode usar o
swapaxes
método das matrizes NumPy ou arollaxis
função NumPy . Realmente, existem muitas maneiras de fazer isso.Para obter uma explicação mais completa sobre a transmissão, consulte http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html
fonte
A solução de JoshAdel usa np.newaxis para adicionar uma dimensão. Uma alternativa é usar reshape () para alinhar as dimensões na preparação para a transmissão .
Executar o reshape () permite que as dimensões se alinhem para transmissão:
Observe que
data/vector
está tudo bem, mas não lhe dá a resposta que deseja. Ele divide cada coluna dearray
(em vez de cada linha ) por cada elemento correspondente devector
. É o que você obteria se explicitamente reformuladovector
para ser em1x3
vez de3x1
.fonte
A maneira pitônica de fazer isso é ...
Isso cuida da remodelagem e também os resultados estão no formato de ponto flutuante. Em outras respostas, os resultados são em formato de número inteiro arredondado.
#NOTA: o número de colunas nos dados e no vetor deve corresponder
fonte
Somando-se à resposta de stackoverflowuser2010, no caso geral, você pode apenas usar
Isso transformará seu vetor em um
column matrix/vector
. Permitindo que você faça as operações elementwise como desejar. Pelo menos para mim, esta é a maneira mais intuitiva de fazer isso e como (na maioria dos casos) o numpy usará apenas uma visualização da mesma memória interna para a remodelagem, é eficiente também.fonte
.reshape(-1,1)
é a maneira mais intuitiva de usar a transmissão.