4.2. NumPy

O principal objeto manipulado pela NumPy é o homogeneous multidimensional array:

Uma tabela de elementos de mesmo tipo (em geral números) indexados por uma tupla de inteiros positivos:

  • As dimensões são chamadas de axes.

  • O número de axes é chamado de rank.

Exemplos:

  • um array \([1, 2, 1]\) tem rank = 1

  • um array \([[ 1.0, 0.0, 0.0], [0.0, 1.0, 2.0]]`\) tem rank = 2: a primeira dimensão tem tamanho 2, a segunda dimensão tem tamanho 3

A classe de array da NumPy é chamada ndarray (numpy.array).

Supondo um ndarray contendo uma matriz de 30 linhas e 40 colunas, as seguintes propriedades estão disponíveis (dentre outras):

  • ndarray.ndim: é o número de axes do array.

  • ndarray.shape: é uma tupla de inteiros indicando o tamanho do array em cada dimensão, no exemplo acima shape = (30, 40)

  • ndarray.size: é o total de elementos no array, no exemplo acima size = 1200

  • ndarray.dtype: é um objeto descrevendo o tipo dos elementos no array (por exemplo, numpy.int32, numpy.int16, numpy.float64)

  • ndarray.itemsize: é o tamanho em bytes de cada elemento no array (por exemplo, em um array de float64, itemsize = 8)

  • ndarray.data: é um buffer contendo os elementos do array, geralmente não é usado dessa forma pois temos facilidades de indexação

4.2.1. Carregando a NumPy

Para utilizar a NumPy devemos importar seu módulo, chamado numpy. Em geral, associamos esse módulo ao nome (ou apelido) np da seguinte forma:

import numpy as np

E para saber a versão da biblioteca:

np.__version__

4.2.2. Criando matrizes

A NumPy fornece várias funções para criação das matrizes. Vamos começar utilizando a função arange, que permite criar um array a partir de um intervalo regular de valores:

np.arange?

Para criar um array unidimensional, isto é, um vetor com 15 elementos, fazemos:

>>> a = np.arange(1, 16)
>>> a
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15])

Nota

Repare que a sequência é iniciada com o valor 1 e termina com o valor 15, uma vez que o limite final (16) não é incluído no intervalo de valores gerados.

type(a)

Vamos criar um segundo array denominado b, desta vez com a função array, que permite criar uma matriz a partir de uma sequência do Python:

np.array?
b = np.array([6, 7, 8])
b

4.2.3. Alterando o formato de uma matriz

Um array NumPy pode ser reestrutrado usando a operação reshape:

np.reshape?

Para alterar o formato do array a para que ele se torne uma matriz \(3 \times 5\):

>>> a = a.reshape(3, 5)
>>> a
array([[1,  2,  3,  4,  5,],
       [6,  7,  8,  9, 10,],
       [11, 12, 13, 14, 15]])

4.2.4. Informações sobre a Estrutura de uma matriz

print('shape', a.shape)
print('ndim', a.ndim)
print('dtype', a.dtype)
print('itemsize', a.itemsize)
print('size', a.size)
print('type(a)', type(a))
print('type(b)', type(b))

4.2.5. Operações com arrays

É possível realizar operações matemáticas com arrays. A NumPy permite que uma operação seja aplicada a todos os elementos, de uma só vez.

# vamos imprimir o resultado
# da soma de todos os elementos
# do array com a constante 10

print('matriz a + constante 10:')
print(a + 10)

Veja que a matriz original não foi alterada, pois não fizemos nenhuma atribuição.

print('matriz original:')
print(a)

Podemos explorar outras operações aritméticas com constantes, e até com outras matrizes.

# o comando a seguir cria uma
# matriz c com 0's, com o mesmo
# tamanho da matriz a

c = np.zeros_like(a)
print(c)

Nota

O comando acima é muito útil em processamento de imagens, quando temos uma banda, e queremos criar uma cópia dessa banda, para realizar algum processamento. A nova matriz tem as mesmas propriedades da matriz da banda, porém todos os valores estão zerados.

# podemos combinar os arrays no
# processamento

c = a * 10
print(c)
# nesta operação, fazemos a divisão
# elemento a elemento das matrizes,
# por isso elas precisam ter o mesmo
# shape

array_divisao = a / c
print(array_divisao)
# aqui temos o produto elemento por
# elemento da matriz (e não o produto
# matricial)

array_produto = a * c
print(array_produto)
# para fazer o produto matricial precisamos
# garantir as propriedades matemáticas
# (número de colunas da primeira matriz =
# número de linhas da segunda matriz), por
# isso fizemos o transpose da segunda matriz

array_produto_matricial = a.dot(c.transpose())
print(array_produto_matricial)

Nota

Uma banda de uma imagem é facilmente processada como um array NumPy. Desta forma, aproveitamos as funcionalidades desta biblioteca para realizar diversos tipos de processamentos com as bandas.

Exemplos incluem a geração de índices espectrais, aplicação de contraste, fatiamento de bandas, entre outros.