Não perca nossa folha de trapaça NumPy GRÁTIS no final deste post
NumPy é um pacote de análise de dados Python comumente usado. Usando o NumPy, você pode acelerar seu fluxo de trabalho, e fazer interface com outros pacotes no ecossistema Python, como o Scikit-learn, que usam o NumPy sob o capô. O NumPy foi originalmente desenvolvido em meados dos anos 2000, e surgiu de um pacote ainda mais antigo chamado Numeric. Esta longevidade significa que quase todos os pacotes de análise de dados ou de aprendizado de máquina para Python alavancam o NumPy de alguma forma.
Neste tutorial, vamos caminhar usando o NumPy para analisar dados sobre a qualidade do vinho. Os dados contêm informação sobre vários atributos dos vinhos, tais como pH
e fixed acidity
, juntamente com uma pontuação de qualidade entre 0
e 10
para cada vinho. O índice de qualidade é a média de pelo menos 3
provadores de sabor humano. À medida que aprendemos a trabalhar com a NumPy, vamos tentando descobrir mais sobre a qualidade percebida do vinho.
Os vinhos que vamos analisar são da região do Minho em Portugal.
Os dados foram descarregados do Repositório de Aprendizagem da Máquina UCI, e estão disponíveis aqui. Aqui estão as primeiras linhas do ficheiro winequality-red.csv
, que vamos utilizar ao longo deste tutorial:
"fixed acidity";"volatile acidity";"citric acid";"residual sugar";"chlorides";"free sulfur dioxide";"total sulfur dioxide";"density";"pH";"sulphates";"alcohol";"quality"7.4;0.7;0;1.9;0.076;11;34;0.9978;3.51;0.56;9.4;57.8;0.88;0;2.6;0.098;25;67;0.9968;3.2;0.68;9.8;5
Os dados estão no formato que vou chamar ssv (valores separados por ponto e vírgula) – cada registo é separado por ponto e vírgula (;
), e as linhas são separadas por uma nova linha. Existem 1600
linhas no ficheiro, incluindo uma linha de cabeçalho, e 12
colunas.
Antes de começarmos, uma nota de versão rápida – vamos usar o Python 3.5. Nossos exemplos de código serão feitos usando Jupyter notebook.
- Lists Of Lists for CSV Data
- Arrays 2-Dimensionais Númulos
- Criando um array NumPy
- Métodos Alternativos de Criação de Matrizes NumPy
- Usando NumPy para ler em arquivos
- Indexando Arrays NumPy
- Slicing NumPy Arrays
- Atribuir valores a arrays NumPy
- 1-Dimensional NumPy Arrays
- N-Dimensional NumPy Arrays
- NumPy Tipos de Dados
- Converter tipos de dados
- NumPy Array Operations
- Matéria Única de Matriz
- Multiple Array Math
- Broadcasting
- NumPy Array Methods
- NumPy Array Comparisons
- Subsetting
- Reestruturação de Arrays NumPy
- Combinando Arrays NumPy
- Free NumPy Cheat Sheet
- Outras leituras
Lists Of Lists for CSV Data
Antes de usar o NumPy, vamos primeiro tentar trabalhar com os dados usando o Python e o pacote csv. Podemos ler no arquivo usando o objeto csv.reader, que nos permitirá ler e dividir todo o conteúdo do arquivo ssv.
No código abaixo, nós:
- Importar o objeto
csv
biblioteca. - Abrir o objeto
winequality-red.csv
arquivo.- Com o arquivo aberto, crie um novo objeto
csv.reader
.- Passar no argumento da palavra-chave
delimiter=";"
para ter certeza que os registros estão divididos no caractere ponto-e-vírgula ao invés do caractere vírgula padrão.
- Passar no argumento da palavra-chave
- Chamar o tipo de lista para obter todas as linhas do arquivo.
- Atribuir o resultado a
wines
.
- Com o arquivo aberto, crie um novo objeto
import csvwith open('winequality-red.csv', 'r') as f: wines = list(csv.reader(f, delimiter=';'))
Após lermos os dados, podemos imprimir o primeiro 3
linhas:
print(wines)
, , ]
Os dados foram lidos numa lista de listas. Cada lista interna é uma linha do arquivo ssv. Como você deve ter notado, cada item em toda a lista de listas é representado como uma string, o que tornará mais difícil fazer cálculos.
Formataremos os dados em uma tabela para facilitar a visualização:
acidez fixa | acidez volátil | ácido cítrico | açúcar residual | cloretos | enxofre livre dióxido | dióxido de enxofre total | densidade | pH | sulfatos | álcool | qualidade |
---|---|---|---|---|---|---|---|---|---|---|---|
7.4 | 0.70 | 0 | 1.9 | 0.076 | 11 | 34 | 0.9978 | 3.51 | 0.56 | 9.4 | 5 |
7.8 | 0.88 | 0 | 2.6 | 0.098 | 25 | 67 | 0.9968 | 3.20 | 0.68 | 9.8 | 5 |
Como pode ver na tabela acima, lemos em três filas, a primeira das quais contém cabeçalhos de coluna. Cada linha após a linha do cabeçalho representa um vinho. O primeiro elemento de cada linha é o fixed acidity
, o segundo é o volatile acidity
, e assim por diante. Podemos encontrar a média quality
dos vinhos. O código abaixo irá:
- Extrair o último elemento de cada linha após a linha do cabeçalho.
- Converter cada elemento extraído para um float.
- Atribuir todos os elementos extraídos para a lista
qualities
. - Dividir a soma de todos os elementos em
qualities
pelo número total de elementos emqualities
para obter a média.
qualities =) for item in wines]sum(qualities) / len(qualities)
5.6360225140712945
Embora tenhamos sido capazes de fazer o cálculo que queríamos, o código é bastante complexo, e não será divertido ter que fazer algo semelhante cada vez que quisermos calcular uma quantidade. Felizmente, podemos usar o NumPy para facilitar o trabalho com nossos dados.
Arrays 2-Dimensionais Númulos
Com o NumPy, trabalhamos com arrays multidimensionais. Mais tarde, vamos mergulhar em todos os tipos de matrizes multidimensionais possíveis, mas por enquanto, vamos nos concentrar em matrizes bidimensionais. Uma matriz bidimensional também é conhecida como matriz, e é algo com que você deve estar familiarizado. Na verdade, é apenas uma forma diferente de pensar sobre uma lista de listas. Uma matriz tem filas e colunas. Ao especificar um número de linha e um número de coluna, somos capazes de extrair um elemento de uma matriz.
Na matriz abaixo, a primeira linha é a linha do cabeçalho, e a primeira coluna é a coluna fixed acidity
:
acidez fixa | acidez volátil | ácido cítrico | açúcar residual | cloretos | enxofre livre dióxido | dióxido de enxofre total | densidade | pH | sulfatos | álcool | qualidade |
---|---|---|---|---|---|---|---|---|---|---|---|
7.4 | 0.70 | 0 | 1.9 | 0.076 | 11 | 34 | 0.9978 | 3.51 | 0.56 | 9.4 | 5 |
7.8 | 0.88 | 0 | 2.6 | 0.098 | 25 | 67 | 0.9968 | 3.20 | 0.68 | 9.8 | 5 |
Se escolhêssemos o elemento na primeira linha e na segunda coluna, teríamos volatile acidity
. Se escolhêssemos o elemento na terceira linha e na segunda coluna, obteríamos 0.88
.
Em uma matriz NumPy, o número de dimensões é chamado de rank, e cada dimensão é chamada de eixo. Então as linhas são o primeiro eixo, e as colunas o segundo eixo.
Agora que você entenda o básico das matrizes, vamos ver como podemos obter da nossa lista de listas para um array NumPy.
Criando um array NumPy
Podemos criar um array NumPy usando a função numpy.array. Se passarmos em uma lista de listas, ele irá criar automaticamente um array NumPy com o mesmo número de linhas e colunas. Como queremos que todos os elementos do array sejam elementos flutuantes para facilitar o cálculo, vamos deixar de fora a linha de cabeçalho, que contém strings. Uma das limitações do NumPy é que todos os elementos em um array têm que ser do mesmo tipo, então se incluirmos a linha de cabeçalho, todos os elementos do array serão lidos como strings. Como queremos ser capazes de fazer cálculos como encontrar a média quality
dos vinhos, precisamos que todos os elementos sejam flutuantes.
No código abaixo, we:
- Importar o pacote
numpy
. - Passar a lista de listas
wines
para a funçãoarray
, que a converte em um array NumPy.- Excluir a linha de cabeçalho com corte de lista.
- Especificar o argumento da palavra-chave
dtype
para ter certeza de que cada elemento é convertido em um float. Vamos mergulhar mais no que odtype
é mais tarde.
import csvwith open("winequality-red.csv", 'r') as f: wines = list(csv.reader(f, delimiter=";"))import numpy as npwines = np.array(wines, dtype=np.float)
Tente executar o código acima e ver o que acontece!
Se mostrarmos wines
, vamos agora obter uma matriz NumPy:
wines
array(,,,...,,,])
Podemos verificar o número de linhas e colunas nos nossos dados usando a propriedade de forma das matrizes NumPy:
wines.shape
(1599, 12)
Métodos Alternativos de Criação de Matrizes NumPy
Existem vários métodos que você pode usar para criar matrizes NumPy. Para começar, você pode criar um array onde cada elemento é zero. O código abaixo irá criar um array com 3
linhas e 4
colunas, onde cada elemento é 0
, usando numpy.zeros:
import numpy as np
empty_array = np.zeros((3,4)) empty_array
É útil criar um array com todos os elementos zero nos casos em que você precisa de um array de tamanho fixo, mas ainda não tem nenhum valor para ele.
Você também pode criar um array onde cada elemento é um número aleatório usando numpy.random.rand. Aqui está um exemplo:
np.random.rand(3,4)
array(,,])
Criar arrays cheios de números aleatórios pode ser útil quando você quer testar rapidamente seu código com arrays.
Usando NumPy para ler em arquivos
É possível usar NumPy para ler diretamente csv ou outros arquivos em arrays. Nós podemos fazer isso usando a função numpy.genfromtxt. Podemos usá-la para ler em nossos dados iniciais sobre vinhos tintos.
No código abaixo, we:
- Utilizar a função
genfromtxt
para ler emwinequality-red.csv
file. - Especificar o argumento da palavra-chave
delimiter=";"
para que os campos sejam analisados corretamente. - Especificar o argumento da palavra-chave
skip_header=1
para que a linha do cabeçalho seja pulada.
wines = np.genfromtxt("winequality-red.csv", delimiter=";", skip_header=1)
wines
acabará parecendo o mesmo como se o lêssemos em uma lista e depois o convertemos em um array de flutuadores. NumPy irá automaticamente escolher um tipo de dados para os elementos em um array baseado no seu formato.
Indexando Arrays NumPy
Agora sabemos como criar arrays, mas a menos que possamos recuperar resultados deles, não há muito o que podemos fazer com NumPy. Podemos usar a indexação de array para selecionar elementos individuais, grupos de elementos, ou linhas e colunas inteiras. Uma coisa importante a ter em mente é que, assim como as listas Python, NumPy é indexado a zero, o que significa que o índice da primeira linha é 0
, e o índice da primeira coluna é 0
. Se quisermos trabalhar com a quarta linha, usaremos índice 3
, se quisermos trabalhar com a segunda linha, usaremos índice 1
, e assim por diante. Trabalharemos novamente com o índice wines
array:
7,4 | 0,70 | 0,00 | 1,9 | 0.076 | 11 | 34 | 0.9978 | 3.51 | 0.56 | 9.4 | 5 |
7.8 | 0.88 | 0.00 | 2.6 | 0.098 | 25 | 67 | 0.9968 | 3.20 | 0.68 | 9.8 | 5 |
7.8 | 0.76 | 0.04 | 2.3 | 0.092 | 15 | 54 | 0.9970 | 3.26 | 0.65 | 9.8 | 5 |
11.2 | 0.28 | 0.56 | 1.9 | 0.075 | 17 | 60 | 0.9980 | 3.16 | 0.58 | 9.8 | 6 |
7.4 | 0.70 | 0.00 | 1.9 | 0.076 | 11 | 34 | 0.9978 | 3.51 | 0,56 | 9,4 | 5 |
Vamos seleccionar o elemento na linha 3
e na coluna 4
. No código abaixo, passamos no índice 2
como o índice da linha, e o índice 3
como o índice da coluna. Isto recupera o valor da quarta coluna da terceira linha:
wines
2.2999999999999998
Desde que estamos trabalhando com um array bidimensional em NumPy, nós especificamos 2 índices para recuperar um elemento. O primeiro índice é a linha, ou eixo 1
, índice, e o segundo índice é a coluna, ou eixo 2
, índice. Qualquer elemento em wines
pode ser recuperado usando 2
indexes.
Slicing NumPy Arrays
Se quisermos selecionar os três primeiros itens da quarta coluna, podemos fazê-lo usando dois pontos (:
). Um dois pontos indica que queremos selecionar todos os elementos do índice inicial até o índice final, mas sem incluir o índice final. Isto também é conhecido como uma fatia:
wines
array()
Apenas como com o corte da lista, é possível omitir o 0
para apenas recuperar todos os elementos do início até o elemento 3
:
wines
array()
Podemos selecionar uma coluna inteira especificando que queremos todos os elementos, do primeiro ao último. Especificamos isto usando apenas os dois pontos (:
), sem índices de início ou fim. O código abaixo irá seleccionar a quarta coluna inteira:
wines
array()
Seleccionamos uma coluna inteira acima, mas também podemos extrair uma linha inteira:
wines
array()
Se levarmos a nossa indexação ao extremo, podemos seleccionar a array inteira usando dois pontos para seleccionar todas as linhas e colunas em wines
. Este é um grande truque de festa, mas não tem muitas aplicações boas:
wines
array(,,<br />,<br />...,,,<br />])
Atribuir valores a arrays NumPy
Também podemos usar indexação para atribuir valores a certos elementos em arrays. Podemos fazer isso atribuindo diretamente ao valor indexado:
wines = 10
Podemos fazer o mesmo para as fatias. Para sobrepor uma coluna inteira, podemos fazer isto:
wines = 50
O código acima escreve todos os valores da décima primeira coluna com 50
.
1-Dimensional NumPy Arrays
Até agora, temos trabalhado com arrays bidimensionais, tais como wines
. No entanto, NumPy é um pacote para trabalhar com arrays multidimensionais. Um dos tipos mais comuns de arrays multidimensionais é o array 1-dimensional, ou vetor. Como você deve ter notado acima, quando nós fatiamos wines
, nós recuperamos um array unidimensional. Um array unidimensional só precisa de um único índice para recuperar um elemento. Cada linha e coluna em um array bidimensional é um array unidimensional. Assim como uma lista de listas é análoga a um array bidimensional, uma única lista é análoga a um array unidimensional. Se cortarmos os vinhos e apenas recuperarmos a terceira linha, obtemos um array unidimensional:
third_wine = wines
Aqui está como third_wine
parece:
11.2000.2800.5601.9000.07517.00060.0000.9983.1600.5809.8006.000
Podemos recuperar elementos individuais de third_wine
usando um único índice. O código abaixo exibirá o segundo item em third_wine
:
third_wine
0.28000000000000003
Mais funções NumPy com as quais trabalhamos, tais como numpy.random.rand, podem ser usadas com arrays multidimensionais. Aqui está como usaríamos numpy.random.rand
para gerar um vetor aleatório:
np.random.rand(3)
array()
Anteriormente, quando chamamos np.random.rand
, passamos em uma forma para um array bidimensional, então o resultado foi um array bidimensional. Desta vez, nós passamos em uma forma para um array unidimensional. A forma especifica o número de dimensões, e o tamanho do array em cada dimensão. Uma forma de (10,10)
será um array bidimensional com 10
linhas e 10
colunas. Uma forma de (10,)
será um array unidimensional com 10
elementos.
Onde a NumPy fica mais complexa é quando começamos a lidar com arrays que têm mais de 2
dimensões.
N-Dimensional NumPy Arrays
Isso não acontece com muita frequência, mas há casos em que você vai querer lidar com arrays que têm dimensões maiores que 3
. Uma maneira de pensar nisto é como uma lista de listas de listas. Digamos que queremos armazenar os ganhos mensais de uma loja, mas queremos ser capazes de rapidamente procurar os resultados por um trimestre, e por um ano. Os ganhos de um ano podem parecer assim:
A loja ganhou 0
em janeiro, 5
em fevereiro, e assim por diante. Podemos dividir estes ganhos por trimestre numa lista de listas:
year_one = , , , ]
Podemos recuperar os ganhos de Janeiro ligando para year_one
. Se quisermos os resultados de um trimestre inteiro, podemos ligar para year_one
ou year_one
. Agora temos uma matriz bidimensional, ou matriz. Mas e se agora quisermos adicionar os resultados de outro ano? Temos que adicionar uma terceira dimensão:
earnings = , , , ], , , , ]]
Podemos recuperar os ganhos de janeiro do primeiro ano chamando earnings
. Agora precisamos de três índices para recuperar um único elemento. Uma matriz tridimensional em NumPy é muito parecida. Na verdade, podemos converter earnings
para um array e então obter os ganhos de janeiro do primeiro ano:
earnings = np.array(earnings)earnings
500
Também podemos encontrar o formato do array:
earnings.shape
(2, 4, 3)
Indexando e fatiando trabalhamos exatamente da mesma forma com um array tridimensional, mas agora temos um eixo extra para passar. Se quiséssemos obter os ganhos de janeiro de todos os anos, poderíamos fazer isso:
earnings
array()
Se quiséssemos obter os ganhos do primeiro trimestre de ambos os anos, poderíamos fazer isso:
earnings
array(,])
Adicionar mais dimensões pode tornar muito mais fácil a consulta dos seus dados se eles estiverem organizados de uma certa forma. Como passamos de matrizes tridimensionais para matrizes 4-dimensionais e maiores, as mesmas propriedades se aplicam, e elas podem ser indexadas e fatiadas das mesmas maneiras.
NumPy Tipos de Dados
Como mencionamos anteriormente, cada matriz NumPy pode armazenar elementos de um único tipo de dado. Por exemplo, wines
contém apenas valores de flutuação. NumPy armazena valores usando seus próprios tipos de dados, que são distintos dos tipos Python como float
e str
. Isto porque o núcleo da NumPy é escrito em uma linguagem de programação chamada C, que armazena dados de forma diferente dos tipos de dados Python. Os tipos de dados NumPy mapeiam entre Python e C, permitindo-nos usar arrays NumPy sem nenhum acerto de conversão.
Você pode encontrar o tipo de dados de um array NumPy acessando a propriedade dtype:
wines.dtype
dtype('float64')
NumPy tem vários tipos de dados diferentes, que na maioria das vezes mapeiam os tipos de dados Python, como float
, e str
. Você pode encontrar uma lista completa dos tipos de dados NumPy aqui, mas aqui estão alguns importantes:
-
float
– dados numéricos de ponto flutuante. -
int
– dados inteiros. -
string
– dados de caracteres. -
object
– objetos Python.
Tipos de dados terminam adicionalmente com um sufixo que indica quantos bits de memória eles ocupam. Então int32
é um tipo de dado inteiro de 32 bits, e float64
é um tipo de dado de flutuador de bits.
Converter tipos de dados
Pode usar o método numpy.ndarray.astype para converter um array para um tipo diferente. O método irá copiar o array, e retornar um novo array com o tipo de dado especificado. Por exemplo, podemos converter wines
para int
data type:
wines.astype(int)
array(,,,...,,,])
Como você pode ver acima, todos os itens no array resultante são inteiros. Note que usamos o tipo de dados Python int
em vez de um tipo de dados NumPy quando convertemos wines
. Isto porque vários tipos de dados Python, incluindo float
, int
, e string
, podem ser usados com NumPy, e são automaticamente convertidos para NumPy tipos de dados.
Podemos verificar a propriedade do nome do dtype do array resultante para ver que tipo de dados NumPy mapeou o array resultante para:
int_wines = wines.astype(int)int_wines.dtype.name
'int64'
O array foi convertido para um tipo de dados inteiro de 64 bits. Isto permite valores inteiros muito longos, mas ocupa mais espaço na memória do que armazenar os valores como inteiros de 32 bits.
Se você quiser mais controle sobre como o array é armazenado na memória, você pode criar diretamente objetos NumPy dtype como numpy.int32:
np.int32
numpy.int32
Você pode usá-los diretamente para converter entre tipos:
wines.astype(np.int32)
array(,,,...,,,], dtype=int32)
NumPy Array Operations
NumPy torna simples a realização de operações matemáticas em arrays. Esta é uma das principais vantagens do NumPy, e torna bastante fácil fazer cálculos.
Matéria Única de Matriz
Se você fizer qualquer uma das operações matemáticas básicas (/
, *
, -
, +
, ^
) com um array e um valor, ele aplicará a operação a cada um dos elementos do array.
Vamos dizer que queremos adicionar 10
pontos a cada pontuação de qualidade porque estamos bêbados e nos sentimos generosos. Eis como o faríamos:
wines + 10
array()
Note que a operação acima não irá alterar o array wines
– irá retornar um novo array unidimensional onde 10
foi adicionado a cada elemento da coluna de qualidade dos vinhos.
Se em vez disso fizéssemos +=
, modificaríamos o array no lugar:
wines += 10wines
array()
Todas as outras operações funcionam da mesma forma. Por exemplo, se quisermos multiplicar cada uma das pontuações de qualidade por 2
, poderíamos fazê-lo assim:
wines * 2
array()
Multiple Array Math
É possível também fazer operações matemáticas entre arrays. Isto irá aplicar a operação aos pares de elementos. Por exemplo, se adicionarmos a coluna quality
a si mesma, eis o que obtemos:
wines + wines
array()
Nota que isto é equivalente a wines * 2
– isto porque NumPy adiciona cada par de elementos. O primeiro elemento do primeiro array é adicionado ao primeiro elemento do segundo array, o segundo ao segundo, e assim por diante.
Também podemos usar isto para multiplicar os arrays. Digamos que queremos escolher um vinho que maximize o teor alcoólico e a qualidade (queremos ficar bêbados, mas temos classe). Multiplicaríamos alcohol
por quality
, e seleccionaríamos o vinho com a pontuação mais alta:
wines * wines
array()
Todas as operações comuns (/
, *
, -
, +
, ^
) funcionarão entre arrays.
Broadcasting
A menos que as arrays em que está a operar sejam exactamente do mesmo tamanho, não é possível fazer operações por elementos. Em casos como este, a NumPy realiza transmissões para tentar combinar elementos. Essencialmente, a transmissão envolve alguns passos:
- A última dimensão de cada array é comparada.
- Se os comprimentos das dimensões forem iguais, ou se uma das dimensões for de comprimento
1
, então continuamos. - Se os comprimentos das dimensões não forem iguais, e nenhuma das dimensões tiver comprimento
1
, então há um erro.
- Se os comprimentos das dimensões forem iguais, ou se uma das dimensões for de comprimento
- Continuar verificando dimensões até que a menor dimensão do array esteja fora das dimensões.
Por exemplo, as duas formas seguintes são compatíveis:
A: (50,3)B (3,)
Isto é porque o comprimento da dimensão do array do trailing A
é 3
, e o comprimento da dimensão do array do trailing B
é 3
. Eles são iguais, então essa dimensão é ok. Array B
está então fora dos elementos, então estamos bem, e os arrays são compatíveis para operações matemáticas.
As duas formas seguintes também são compatíveis:
A: (1,2)B (50,2)
A última dimensão corresponde, e A
é de comprimento 1
na primeira dimensão.
Estas duas matrizes não combinam:
A: (50,50)B: (49,49)
Os comprimentos das dimensões não são iguais, e nenhuma das matrizes tem um comprimento de dimensão igual a 1
.
Existe aqui uma explicação detalhada da transmissão, mas vamos passar por alguns exemplos para ilustrar o princípio:
wines * np.array()
------------------------------------------------------------------------ValueError Traceback (most recent call last)<ipython -input-40-821086ccaf65> in <module>()----> 1 wines * np.array()ValueError: operands could not be broadcast together with shapes (1599,12) (2,)</module></ipython>
O exemplo acima não funcionou porque as duas matrizes não têm uma dimensão de trailing correspondente. Aqui está um exemplo em que a última dimensão corresponde:
array_one = np.array( , ])array_two = np.array()array_one + array_two
array(,])
Como você pode ver, array_two
foi transmitida através de cada linha de array_one
. Aqui está um exemplo com o nosso wines
data:
rand_array = np.random.rand(12)wines + rand_array
array(,,,...,,,])
Elementos de rand_array
são transmitidos através de cada linha de wines
, portanto a primeira coluna de wines
tem o primeiro valor em rand_array
adicionado a ele, e assim por diante.
NumPy Array Methods
Além das operações matemáticas comuns, NumPy também tem vários métodos que você pode usar para cálculos mais complexos em arrays. Um exemplo disso é o método numpy.ndarray.sum. Isto encontra a soma de todos os elementos em um array por padrão:
wines.sum()
9012.0
O total de todas as nossas classificações de qualidade é 154.1788
. Podemos passar o argumento axis
para o método sum
para encontrar somas sobre um eixo. Se chamarmos sum
através da matriz wines
, e passarmos em axis=0
, vamos encontrar as somas sobre o primeiro eixo da matriz. Isto nos dará a soma de todos os valores em cada coluna. Isto pode parecer ao contrário que as somas sobre o primeiro eixo nos dariam a soma de cada coluna, mas uma maneira de pensar sobre isto é que o eixo especificado é aquele que “vai embora”. Então se especificarmos axis=0
, queremos que as linhas desapareçam, e queremos encontrar as somas para cada um dos eixos restantes em cada linha:
wines.sum(axis=0)
array()
Podemos verificar que fizemos a soma correctamente verificando a forma. A forma deve ser 12
, correspondente ao número de colunas:
wines.sum(axis=0).shape
(12,)
Se passarmos em axis=1
, encontraremos as somas sobre o segundo eixo do array. Isto nos dará a soma de cada linha:
wines.sum(axis=1)
array()
Existem vários outros métodos que se comportam como o método sum
, incluindo:
- numpy.ndarray.mean – encontra a média de um array.
- numpy.ndarray.std – encontra o desvio padrão de um array.
- numpy.ndarray.min – encontra o valor mínimo em um array.
- numpy.ndarray.max – encontra o valor máximo em um array.
Você pode encontrar uma lista completa de métodos de array aqui.
NumPy Array Comparisons
NumPy torna possível testar se as linhas correspondem a certos valores usando operações de comparação matemática como <
, >
, >=
, <=
, e ==
. Por exemplo, se quisermos ver quais vinhos têm uma classificação de qualidade superior a 5
, podemos fazer isto:
wines > 5
array(, dtype=bool)
>
Obtemos um conjunto booleano que nos diz quais dos vinhos têm uma classificação de qualidade superior a 5
. Podemos fazer algo semelhante com os outros operadores. Por exemplo, podemos ver se algum vinho tem uma classificação de qualidade igual a 10
:
wines == 10
array(, dtype=bool)
Subsetting
Uma das coisas poderosas que podemos fazer com um array Booleano e um array NumPy é selecionar apenas certas linhas ou colunas no array NumPy. Por exemplo, o código abaixo apenas selecionará linhas em wines
onde a qualidade é superior a 7
:
high_quality = wines > 7wines
array(,,])
Selecionamos apenas as linhas onde high_quality
contém um valor True
, e todas as colunas. Este subconjunto torna simples filtrar arrays para certos critérios. Por exemplo, podemos procurar por vinhos com muito álcool e de alta qualidade. A fim de especificar várias condições, temos de colocar cada condição entre parênteses, e separar as condições com um sinal de ampersand (&
):
high_quality_and_alcohol = (wines > 10) & (wines > 7)wines
array(,,,,,,,,,,,,,,,])
Podemos combinar o subconjunto e a atribuição para sobrepor certos valores num array:
high_quality_and_alcohol = (wines > 10) & (wines > 7)wines = 20
Reestruturação de Arrays NumPy
Podemos alterar a forma dos arrays, preservando todos os seus elementos. Isso muitas vezes pode facilitar o acesso aos elementos de array. A remodelação mais simples é inverter os eixos, assim as linhas tornam-se colunas, e vice-versa. Nós podemos fazer isso com a função numpy.transpose:
np.transpose(wines).shape
(12, 1599)
Nós podemos usar a função numpy.ravel para transformar um array em uma representação unidimensional. Ele irá essencialmente achatar um array em uma longa seqüência de valores:
wines.ravel()
array()
Aqui está um exemplo onde podemos ver a ordenação de numpy.ravel
:
array_one = np.array( , ])array_one.ravel()
array()
Finalmente, podemos usar a função numpy.reshape para reformular um array para uma determinada forma que especificamos. O código abaixo irá transformar a segunda linha de wines
em um array bidimensional com 2
linhas e 6
colunas:
wines.reshape((2,6))
array(,])
Combinando Arrays NumPy
Com NumPy, é muito comum combinar múltiplos arrays em um único array unificado. Podemos usar o numpy.vstack para empilhar verticalmente múltiplas arrays. Pense nisso como os itens da segunda arrays sendo adicionados como novas linhas ao primeiro array. Podemos ler no conjunto de dados winequality-white.csv
, que contém informação sobre a qualidade dos vinhos brancos, e depois combiná-lo com o nosso conjunto de dados existente, wines
, que contém informação sobre vinhos tintos.
No código abaixo, nós:
- Ler em
winequality-white.csv
. - Exibir a forma de
white_wines
.
white_wines = np.genfromtxt("winequality-white.csv", delimiter=";", skip_header=1)white_wines.shape
(4898, 12)
Como pode ver, nós temos atributos para 4898
vinhos. Agora que temos os dados dos vinhos brancos, podemos combinar todos os dados do vinho.
No código abaixo, nós:
- Utilizar a função
vstack
para combinarwines
ewhite_wines
. - Exibir a forma do resultado.
all_wines = np.vstack((wines, white_wines))all_wines.shape
(6497, 12)
Como pode ver, o resultado tem 6497
linhas, que é a soma do número de linhas em wines
e o número de linhas em red_wines
.
Se quisermos combinar arrays horizontalmente, onde o número de linhas permanece constante, mas as colunas estão unidas, então podemos usar a função numpy.hstack. As arrays que combinamos precisam ter o mesmo número de linhas para isso funcionar.
Finalmente, podemos usar o numpy.concatenate como uma versão de propósito geral de hstack
e vstack
. Se quisermos concatenar dois arrays, passamos para concatenate
, então especifique o argumento axis
da palavra-chave que queremos concatenar junto. A concatenação ao longo do primeiro eixo é semelhante a vstack
, e a concatenação ao longo do segundo eixo é semelhante a hstack
:
np.concatenate((wines, white_wines), axis=0)
array(,,,...,,,])
Free NumPy Cheat Sheet
Se você estiver interessado em aprender mais sobre NumPy, confira nosso curso interativo sobre NumPy e Pandas. Você pode se registrar e fazer as primeiras missões gratuitamente.
Você também pode querer levar suas habilidades de NumPy para o próximo nível com nossa folha de trapaças NumPy gratuita!
Outras leituras
Você agora deve ter um bom domínio de NumPy, e como aplicá-lo a um conjunto de dados.
Se você quiser mergulhar em mais profundidade, aqui estão alguns recursos que podem ser úteis:
- NumPy Quickstart – tem bons exemplos de código e cobre a maioria das funcionalidades básicas da NumPy.
- Python NumPy Tutorial – um ótimo tutorial sobre NumPy e outras bibliotecas Python.
- Introdução Visual NumPy – um guia que usa o jogo da vida para ilustrar conceitos NumPy.
Em nosso próximo tutorial, mergulharemos mais em Pandas, uma biblioteca que se baseia em NumPy e torna a análise de dados ainda mais fácil. Ela resolve dois dos maiores pontos de dor que são:
- Você não pode misturar vários tipos de dados em um array.
- Você tem que lembrar que tipo de dados cada coluna contém.
Vik é o CEO e Fundador do Dataquest.