|
Gracias a las excelentes nuevas capacidades de corte de arrays de NumSharp, la comunidad .NET está un paso más cerca de contar con una potente plataforma de aprendizaje automático de código abierto. Python es un lenguaje de aprendizaje automático en parte porque tiene grandes librerías como NumPy y TensorFlow. Sin embargo, los desarrolladores de C# también tienen una gran necesidad de potentes librerías de código abierto para aprendizaje automático y ciencia de datos. NumSharp, el port NumPy en C# de la organización SciSharp STACK, ha dado recientemente un gran paso adelante al implementar completamente capacidades de segmentación, permitiendo la creación de subconjuntos arbitrarios de arrays N-dimensionales como vistas eficientes de datos en bruto. Esto la convierte en una herramienta útil para usar C# en aprendizaje automático junto con TensorFlow.NET.
¿Cuál es el problema?
Si no has usado NumPy, probablemente no sepas lo bueno que es el slicing. Los arrays de Python permiten devolver una porción de un array indexando una serie de elementos, de la siguiente manera: a[start:stop:step]. Pero solo con la compleja implementación de arrays de NumPy el sliceing se convierte en una técnica de manipulación de datos realmente poderosa, sin la cual el aprendizaje automático o la ciencia de datos serían inimaginables. Por suerte, para quienes no pueden o no quieren cambiar a Python para aprendizaje automático (que yo también hice), NumSharp aporta esta capacidad al mundo .NET. Como uno de los desarrolladores de NumSharp, te he presentado algunos casos de uso importantes de segmentación con fragmentos de código de ejemplo en C#. Ten en cuenta que la indexación no puede hacerse en C# de la misma manera que en Python debido a diferencias en la sintaxis del lenguaje. Sin embargo, decidimos mantener la sintaxis de Python para las definiciones de segmentos, así que usamos cadenas para indexar cortes en C#. Echa un vistazo a este ejemplo para ver lo cerca que está NumSharp de NumPy.
Recorta la columna de la matriz en Python/NumPyCuando se escribe en C# con NumSharp, el código es casi idéntico. Ten en cuenta que las secciones se indexan de forma ligeramente diferente usando cadenas como parámetros para el indexador.
Recorta columnas de una matriz en C#/NumSharpComo puedes ver, el equipo de NumSharp ha puesto mucho esfuerzo en que el código sea lo más parecido posible a Python. Esto es muy importante porque de esta manera, el código Python existente que depende de NumPy puede ahora portarse fácilmente a C#.
Caso de uso: Utilizar múltiples vistas de los mismos datos
Poder pasar solo partes locales de los datos subyacentes (es decir, pequeños fragmentos de imágenes grandes) dentro y fuera de funciones sin copiarlas es fundamental para el rendimiento en tiempo de ejecución, especialmente para conjuntos de datos grandes. Los slices se indexan usando coordenadas locales, por lo que tu algoritmo no necesita conocer la estructura global de tus datos, simplificando efectivamente tu vida y asegurando el máximo rendimiento porque se evita duplicaciones innecesarias.
Casos de uso: vistas dispersas y segmentación recursiva
Se puede crear una vista dispersa de un array especificando pasos más allá del inicio y el final del rango de cortes. Que yo sepa, ni siquiera C# 8.0 con la nueva sintaxis de array slice puede hacer esto. Esta característica se vuelve muy importante al tratar con datos entrelazados. Puedes diseñar tu algoritmo para manejar datos continuos y proporcionarle segmentos dispersos que imiten fuentes de datos continuas, minimizando la complejidad de tu algoritmo.
El segmentado puede cortarse aún más, lo cual es una característica muy importante si se trata con datos de alta dimensión. Esto también ayuda a reducir la complejidad del algoritmo, ya que puedes disminuir la dimensionalidad de los datos mediante el corte recursivo.
Caso de uso: Procesar de forma eficiente datos de alta dimensión
Si necesitas pensar en un array de datos como un volumen y trabajar con sus partes sin tener que hacer cálculos increíbles de transformación de coordenadas, entonces .reshape() es tu aliado. Todos los arrays creados por operaciones de corte son .reshape() simplemente una vista de los datos originales. Cuando iteras, lees o escribes elementos en una vista, accedes al array de datos en bruto. NumSharp realiza transparentemente las transformaciones de índices adecuadas para ti, para que puedas indexar cortes con coordenadas relativas.
Caso de uso: invertir el orden de los elementos sin coste adicional
Los cortes que usan pasos negativos en realidad invierten el orden de los cortes. La ventaja es que no necesita copiar ni enumerar datos para hacerlo, igual que IEnumerable.Reverse(). La diferencia es que la vista (el resultado de la operación a["::-1"]) muestra los datos en orden inverso, y puedes indexar a esa secuencia invertida sin enumerarla.
Caso de uso: Reducir la complejidad reduciendo dimensiones
Al trabajar con datos de alta dimensión, los algoritmos para esos datos también pueden volverse muy complejos. En uso, cualquier volumen de alta dimensión puede ser de salida. Con el método NumSharp de ToString() NDArray, noté lo simple y hermoso que se ha vuelto el algoritmo al cortar sistemática y recursivamente volúmenes ND en volúmenes (N-1)D, etc. Este enfoque de divide y vencerás devuelve subvolúmenes de baja dimensión cortando los símbolos de rango usando los símbolos índice de NumSharp. Símbolo de rango vs. símbolo índiceEl símbolo de rango ["start:stop:step"] permite acceder a un subrango de un volumen dado con la misma dimensión. Así que incluso si solo cortas una columna de la matriz 2D, seguirás obteniendo una matriz 2D con solo una columna. Aquí tienes un breve fragmento de código C# que lo demuestra:
Corta la columna usando el símbolo de rango
El símbolo índice te da una sección de dimensión (N-1) en la ubicación especificada del volumen padre de dimensión N. Así que recortar una columna de una matriz 2D usando símbolos índice te da un vector 1D:
Columnas de corte usando símbolos de índice
Si no has visto la diferencia de un vistazo, aquí tienes las dos definiciones de slice anteriores una al lado de la otra, ange[":,2:3"] vs index[":,2"], que tienen un gran impacto en los resultados. Una referencia completa al nuevo símbolo de corte se puede encontrar en la wiki de NumSharp.
Nota: <T>ArraySlice
Al implementar el segmento de vistas N-dimensionales, concluí que podría ser interesante para muchas otras áreas de .NET, así que lo desglosé en mi propia biblioteca independiente llamada SliceAndDice. Cuenta con ser un envoltorio ligero para indexar cualquier estructura de datos en C# (como o) ArraySlice<T>, y permite usar los mismos mecanismos de remodelado, segmentación y visualización sin todos los demás cálculos numéricos pesados. ¡Solo hacen falta unas pocas cientos de líneas de código para lograr excelentes capacidades de slice! T[]IList<T>
Envolvente
Recientemente, NumSharp ha recibido el mismo mecanismo de corte y visualización, lo que sin duda convierte a NumPy en una de las bibliotecas más importantes del ecosistema de aprendizaje automático de Python. SciSharp STACK es una organización de código abierto formada por un pequeño número de desarrolladores cualificados que han trabajado muy duro para llevar la misma funcionalidad al mundo .NET. Las últimas mejoras de NumSharp son una piedra angular importante para lograrlo. Texto original en:El inicio de sesión del hipervínculo es visible.
|