|
Graças às excelentes novas capacidades de fatiamento de array da NumSharp, a comunidade .NET está um passo mais perto de ter uma poderosa plataforma de aprendizado de máquina open-source. Python é uma linguagem de aprendizado de máquina em parte porque possui ótimas bibliotecas como NumPy e TensorFlow. No entanto, desenvolvedores de C# também têm grande necessidade de bibliotecas open-source poderosas para aprendizado de máquina e ciência de dados. O NumSharp, a versão NumPy C# da organização SciSharp STACK, recentemente deu um grande avanço ao implementar totalmente capacidades de fatiamento, permitindo a criação de subconjuntos arbitrários de arrays N-dimensionais como visualizações eficientes de dados brutos. Isso o torna uma ferramenta útil para usar C# em aprendizado de máquina em conjunto com TensorFlow.NET.
Qual é o problema?
Se você nunca usou o NumPy, provavelmente não sabe o quão bom é o slice. Arrays Python permitem retornar uma fatia de um array indexando uma série de elementos, da seguinte forma: a[start:stop:step]. Mas só com a implementação complexa de arrays do NumPy é que o sliceing se torna uma técnica de manipulação de dados realmente poderosa, sem a qual o aprendizado de máquina ou a ciência de dados seriam inimagináveis. Felizmente, para quem não pode ou não quer mudar para Python para aprendizado de máquina (que eu também fiz), o NumSharp traz essa capacidade para o mundo .NET. Como um dos desenvolvedores da NumSharp, apresentei alguns casos importantes de uso de fatiamento com trechos de código de exemplo em C#. Note que a indexação não pode ser feita em C# da mesma forma que em Python devido a diferenças na sintaxe da linguagem. No entanto, decidimos manter a sintaxe em Python para definições de fatias, então usamos strings para indexar fatias em C#. Confira este exemplo para ver o quão próximo o NumSharp é do NumPy.
Corte a coluna da matriz em Python/NumPyQuando escrito em C# com NumSharp, o código é quase idêntico. Note que as fatias são indexadas de forma um pouco diferente usando strings como parâmetros para o indexador.
Recorte colunas de uma matriz em C#/NumSharpComo você pode ver, a equipe da NumSharp se esforçou muito para tornar o código o mais parecido possível com o Python. Isso é muito importante porque, dessa forma, o código Python existente que depende do NumPy pode ser facilmente portado para C#.
Caso de uso: Usar múltiplas visões dos mesmos dados
Ser capaz de passar apenas partes locais dos dados subjacentes (ou seja, pequenos blocos de imagens grandes) para dentro e para fora de funções sem copiar é fundamental para o desempenho em tempo de execução, especialmente para conjuntos de dados grandes. Os slices são indexados usando coordenadas locais, então seu algoritmo não precisa conhecer a estrutura global dos seus dados, simplificando efetivamente sua vida e garantindo o máximo desempenho, pois a duplicação desnecessária é evitada.
Casos de uso: Visualizações esparsas e fatiamento recursivo
Uma visão esparsa de um array pode ser criada especificando etapas além do início e do fim do intervalo de fatia. Pelo que sei, nem mesmo o C# 8.0 com a nova sintaxe de fatia do array consegue fazer isso. Essa característica se torna muito importante ao lidar com dados entrelaçados. Você pode projetar seu algoritmo para lidar com dados contínuos e fornecer a ele fatias esparsas que imitam fontes de dados contínuas, minimizando a complexidade do seu algoritmo.
O fatiamento pode ser mais fatiado, o que é uma característica muito importante se você estiver lidando com dados de alta dimensão. Isso também ajuda a reduzir a complexidade do algoritmo, pois você pode diminuir a dimensionalidade dos dados por fatiamento recursivo.
Caso de uso: Processar dados de alta dimensão de forma eficiente
Se você precisa pensar em um array de dados como um volume e trabalhar com suas partes sem precisar fazer cálculos incríveis de transformação de coordenadas, então .reshape() é seu amigo. Todos os arrays criados por operações de fatiamento são .reshape() apenas uma visualização dos dados originais. Quando você itera, lê ou escreve elementos em uma visualização, você acessa o array de dados brutos. O NumSharp realiza transparentemente as transformações de índice apropriadas para você, para que você possa indexar fatias com coordenadas relativas.
Caso de uso: Reverter a ordem dos elementos sem custo adicional
Fatias usando passos negativos na verdade invertem a ordem das fatias. A vantagem é que não precisa copiar ou enumerar dados para isso, assim como o IEnumerable.Reverse(). A diferença é que a visualização (resultado da operação a["::-1"]) exibe os dados em ordem inversa, e você pode indexar essa sequência invertida sem enumerá-la.
Caso de uso: Reduzir a complexidade reduzindo dimensões
Ao trabalhar com dados de alta dimensão, os algoritmos desses dados também podem se tornar muito complexos. Em uso, qualquer volume de alta dimensão pode ser salido. Quando o método NumSharp do ToString() se tornou NDArray, percebi como o algoritmo se tornou simples e bonito ao cortar sistematicamente e recursivamente volumes ND em volumes (N-1)D, etc. Essa abordagem de dividir para conquistar retorna subvolumes de baixa dimensão ao fatiar os símbolos de faixa usando os símbolos de índice do NumSharp. Símbolo de faixa vs. símbolo índiceO símbolo de alcance ["start:stop:step"] permite acessar um subintervalo de um determinado volume com a mesma dimensão. Então, mesmo que você corte apenas uma coluna da matriz 2D, ainda assim terá uma matriz 2D com apenas uma coluna. Aqui está um pequeno trecho de código C# que demonstra isso:
Fatie a coluna usando o símbolo de intervalo
O símbolo índice fornece uma fatia (N-1) dimensional na localização especificada do volume pai N-dimensional. Então, cortar uma coluna de uma matriz 2D usando símbolos de índice te dá um vetor 1D:
Colunas de fatia usando símbolos de índice
Se você não viu a diferença à primeira vista, aqui estão as duas definições de fatias acima, lado a lado, ange[:,2:3"] vs index[":,2"], que têm grande impacto nos resultados. Uma referência completa ao novo símbolo de fatia pode ser encontrada na wiki do NumSharp.
Nota: <T>ArraySlice
Ao implementar o sfaing de visões N-dimensionais, concluí que poderia ser interessante para muitas outras áreas do .NET, então o dividi em minha própria biblioteca independente chamada SliceAndDice. Ele é um wrapper leve para indexar qualquer estrutura de dados em C# (como ou) <T>ArraySlice, e permite usar os mesmos mecanismos de remodelação, fatiamento e visualização sem todos os outros cálculos numéricos pesados. São necessárias apenas algumas centenas de linhas de código para alcançar excelentes capacidades de fatiamento! T[]IList<T>
Envolvente
Recentemente, o NumSharp recebeu o mesmo mecanismo de fatiamento e visualização, o que sem dúvida faz do NumPy uma das bibliotecas mais importantes do ecossistema de aprendizado de máquina em Python. A SciSharp STACK é uma organização open source composta por um pequeno número de desenvolvedores qualificados que trabalharam muito para trazer a mesma funcionalidade para o mundo .NET. As melhorias mais recentes da NumSharp são uma pedra fundamental para alcançar isso. Original:O login do hiperlink está visível.
|