Este artículo es un artículo espejo de traducción automática, por favor haga clic aquí para saltar al artículo original.

Vista: 1906|Respuesta: 1

[Consejos] [Traducción]. Función de segmentación de array de NumSharp en NET/C#

[Copiar enlace]
Publicado el 10-1-2025 12:17:13 | | | |

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/NumPy

Cuando 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#/NumSharp

Como 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 índice

El 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.




Anterior:Control de versiones de archivos grandes en git lfs
Próximo:Rocky Linux 9 wake en LAN
 Propietario| Publicado el 10-1-2025 12:18:43 |
NumSharp es adecuado para diversos escenarios, incluyendo investigación educativa, análisis financiero, procesamiento de imágenes, aprendizaje profundo y más.

NumSharp, como parte del SciSharp.org, se ha integrado en una amplia gama de NET Ecosistema de Computación Científica. Aquí tienes algunos artículos relacionados y altamente complementarios que te recomiendo para que los explores más a fondo:

ML.NET: Microsoft推出的开源机器学习框架, 用于训练和部署自定义的机器学习模型。
SciSharp.TensorFlow.Redist: 为.NET环境提供了TensorFlow的封装, 使开发者能够在.NET应用程序中使用TensorFlow执行深度学习任务。
MathNet.Numerics: 提供了一系列数学方法和统计计算工具, 与NumSharp相辅相成。

En conclusión, NumSharp no es solo una biblioteca poderosa independiente, sino una conexión. Un nodo clave en la comunidad de computación científica de .NET.

Dirección del proyecto NumSharp:https://github.com/SciSharp/NumSharp
Renuncia:
Todo el software, materiales de programación o artículos publicados por Code Farmer Network son únicamente para fines de aprendizaje e investigación; El contenido anterior no se utilizará con fines comerciales o ilegales; de lo contrario, los usuarios asumirán todas las consecuencias. La información de este sitio proviene de Internet, y las disputas de derechos de autor no tienen nada que ver con este sitio. Debes eliminar completamente el contenido anterior de tu ordenador en un plazo de 24 horas desde la descarga. Si te gusta el programa, por favor apoya el software genuino, compra el registro y obtén mejores servicios genuinos. Si hay alguna infracción, por favor contáctanos por correo electrónico.

Mail To:help@itsvse.com