Resumo : neste tutorial, você aprenderá sobre a transmissão NumPy e entenderá como ela funciona.
Introdução à transmissão NumPy
Nos tutoriais anteriores, você aprendeu como realizar operações aritméticas em matrizes de tamanhos iguais usando as funções
, add()
, subtract()
e ou como operadores , , e .multiply()
divide()
+
-
*
/
Para realizar operações aritméticas em arrays de diferentes formatos, NumPy usa uma técnica chamada radiodifusão.
Por definição, a transmissão é um conjunto de regras para a aplicação de operações aritméticas em matrizes de diferentes formatos. Abordaremos essas regras em detalhes em breve.
Antes disso, vamos dar alguns exemplos simples de transmissão. Por exemplo, você pode usar o operador + para adicionar um número a um array como este:
import numpy as np
a = np.array([1, 2, 3])
b = a + 1
print(b)
Linguagem de código: Python ( python )
Saída:
[2 3 4]
Linguagem de código: Python ( python )
Este exemplo adiciona o número um a uma matriz 1D usando o operador +
. Internamente, NumPy adiciona o número 1 a cada elemento do array. Essa técnica é chamada de radiodifusão.
Em outras palavras, NumPy transmite o número um na primeira dimensão para corresponder ao formato da matriz 1D.
Conceitualmente, você pode pensar na transmissão acima como equivalente ao seguinte:
import numpy as np
a = np.array([1, 2, 3])
b = a + np.array([1, 1, 1])
print(b)
Linguagem de código: Python ( python )
Portanto, adicionar o número um a um array 1D é como duplicar o número um em outro array 1D [1, 1, 1] e adicionar esse array ao array:
No entanto, o NumPy transmite o número um sem duplicá-lo. Ao fazer isso, o NumPy pode gerenciar com eficiência e acelerar o cálculo na maioria dos casos.
Da mesma forma, você pode adicionar um array 1D a um array 2D usando transmissão como esta:
import numpy as np
a = np.array([
[1, 2, 3],
[4, 5, 6]
])
b = np.array([10, 20, 30])
c = a + b
print(c)
Linguagem de código: Python ( python )
Saída:
[[11 22 33]
[14 25 36]]
Linguagem de código: Python ( python )
Neste exemplo, NumPy transmite o array 1D b
através da segunda dimensão para corresponder ao formato do array a.
Regras de transmissão NumPy
NumPy define um conjunto de regras para transmissão:
- Regra 1: se dois arrays tiverem dimensões diferentes, ele preenche aqueles no lado esquerdo da forma do array que tem menos dimensões.
- Regra 2: se duas dimensões de arrays não corresponderem em nenhuma dimensão, o array com formato igual a um naquela dimensão é esticado (ou transmitido) para corresponder ao formato de outro array.
- Regra 3: se alguma dimensão de dois arrays não for igual e nenhuma for igual a um, NumPy gera um erro.
Vejamos alguns exemplos para entender essas regras.
1) Transmissão NumPy em um exemplo de array
O exemplo a seguir adiciona uma matriz 2D a uma matriz 1D:
import numpy as np
a = np.array([
[1, 2, 3],
[4, 5, 6]
])
b = np.ones(3)
c = a + b
print(c)
Linguagem de código: Python ( python )
Saída:
[[2. 3. 4.]
[5. 6. 7.]]
Linguagem de código: Python ( python )
A tabela a seguir mostra as formas de a e b:
Variedade | Forma |
---|---|
a | (2,3) |
b | (3,) |
Pela regra 1, como o array b tem menos dimensões, o NumPy preenche um à esquerda:
Variedade | Forma |
---|---|
a | (2,3) |
b | (1,3) |
Pela regra 2, as primeiras dimensões de duas formas não são iguais, NumPy estica (ou transmite) a primeira dimensão da matriz b para corresponder:
Variedade | Forma |
---|---|
a | (2,3) |
b | (2,3) |
Agora, as dimensões de ambas as matrizes correspondem. A forma da matriz de resultados é (2,3).
2) Exemplo de transmissão NumPy em ambos os arrays
O exemplo a seguir ilustra o caso em que NumPy transmite ambas as matrizes:
import numpy as np
a = np.array([
[1],
[2],
[3],
])
print(f"a shape: ", a.shape)
b = np.array([1, 2, 3])
print(f"b shape: ", b.shape)
c = a + b
print(c)
print(f"c shape: ", c.shape)
Linguagem de código: Python ( python )
Saída:
a shape: (3, 1)
b shape: (3,)
[[2 3 4]
[3 4 5]
[4 5 6]]
c shape: (3, 3)
Linguagem de código: Python ( python )
Neste exemplo, a forma das matrizes a e b são (3,1) e (3,) respectivamente.
Variedade | Forma |
---|---|
a | (3,1) |
b | (3,) |
Pela regra 1, NumPy preenche a forma de b com uns:
Variedade | Forma |
---|---|
a | (3,1) |
b | (1,3) |
Pela regra 2, NumPy amplia as dimensões de ambos os arrays aeb para corresponder porque ambos são iguais:
Variedade | Forma |
---|---|
a | (3,3) |
b | (3,3) |
A matriz resultante tem o formato (3,3).
3) Transmissão NumPy com exemplo de erro
O exemplo a seguir adiciona duas matrizes que não são compatíveis:
import numpy as np
a = np.array([
[1, 2],
[3, 4],
[5, 6],
])
print(f"a shape: ", a.shape)
b = np.array([1, 2, 3])
print(f"b shape: ", b.shape)
c = a + b
Linguagem de código: Python ( python )
Emite o seguinte erro:
a shape: (3, 2)
b shape: (3,)
ValueError: operands could not be broadcast together with shapes (3,2) (3,)
Linguagem de código: Python ( python )
Neste exemplo, a matriz aeb tem as seguintes formas:
Variedade | Forma |
---|---|
a | (3,2) |
b | (3,) |
Pela regra 1, NumPy preenche a forma do segundo array com uns:
Variedade | Forma |
---|---|
a | (3,2) |
b | (1,3) |
Pela regra 2, NumPy amplia a primeira dimensão do array b de 1 para 3 para corresponder:
Variedade | Forma |
---|---|
a | (3,2) |
b | (3,3) |
Pela regra 3, as formas finais não correspondem, portanto, NumPy gera um erro.
Resumo
- A transmissão NumPy é um conjunto de regras para aplicar operações aritméticas em matrizes de diferentes formatos.