Etiqueta: python

  • EXPLORANDO LAS ESTRUCTURAS DE DATOS EN PYTHON: matrices

    EXPLORANDO LAS ESTRUCTURAS DE DATOS EN PYTHON: matrices

    Continuando con nuestro estudio sobre las estructuras en Python, las matrices, que asemejan tablas bidimensionales, son herramientas fundamentales para el análisis y la manipulación de datos en Python.

    Si bien las listas anidadas ofrecen una forma básica de crear matrices, NumPy emerge como la opción poderosa y eficiente. Acompáñame y sigamos descubriendo estas útiles estructuras, y si te perdiste el anterior post te dejo el enlace aquí.

    Matrices en Python: Una explicación detallada

    Un matriz es una estructura de datos bidimensional que se asemeja a una tabla rectangular. Está formada por filas y columnas, y cada elemento de la matriz se encuentra en una posición específica determinada por su índice de fila y columna.

    En Python, existen dos formas principales de crear matrices:

    1. Listas de listas: Se puede crear una matriz utilizando listas anidadas, donde cada lista interna representa una fila de la matriz, en este tipo no ahondaremos mucho, ya que lo vimos en un anterior post, sin embargo te dejo un ejemplo:
    matriz = [
        [1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]
    ]
    1. Arrays NumPy: La biblioteca NumPy ofrece una forma más eficiente de trabajar con matrices. Los arrays NumPy son colecciones de elementos homogéneos almacenados en memoria contigua, lo que permite un rendimiento superior al de las listas anidadas para operaciones matemáticas y científicas.
    import numpy as np
    
    matriz = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
    print(matrix_1)
    
    # [[1 2 3]
    #  [4 5 6]
    #  [7 8 9]]

    ¿Por qué utilizar arrays NumPy?

    Si bien ambas formas permiten crear matrices, los arrays NumPy presentan ventajas significativas:

    • Rendimiento: Las operaciones matemáticas y científicas realizadas sobre arrays NumPy ya que son mucho más eficientes que las realizadas sobre listas anidadas. Esto se debe a la forma en que se almacenan los datos en memoria.
    • Funcionalidad: NumPy ofrece una amplia gama de funciones matemáticas y de manipulación de matrices que facilitan el trabajo con datos multidimensionales.
    • Escalabilidad: Los arrays NumPy pueden escalar a tamaños mucho mayores que las listas anidadas sin perder eficiencia.

    Ya que las matrices con NumPy son estructuras matemáticas, además de poderse aplicar las mismas transformaciones que vimos con las listas, podemos aplicar la transposición, que consiste en una operación que intercambia las filas y las columnas. En otras palabras, los elementos de cada fila pasan a formar las columnas de la matriz transpuesta, y viceversa. Esta operación es muy importante en ciencia de datos e inteligencia artificial, ya que nos permite trabajar con derivadas, pero veamos algunos de sus usos:

    • Adaptar la matriz a la entrada de otra función o algoritmo que espera los datos en un formato específico.
    • Cambiar la orientación de los datos para su visualización o análisis.
    • Realizar cálculos matemáticos específicos que requieren la matriz en un formato transpuesto.
    import numpy as np
    
    # Crea una matriz de ejemplo
    matriz = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
    
    # Imprime la matriz original
    print("Matriz original:\n", matriz)
    
    # Transpone la matriz usando la función transpose()
    matriz_transpuesta = matriz.transpose()
    
    # Imprime la matriz transpuesta
    print("\nMatriz transpuesta:\n", matriz_transpuesta)
    Matriz original:
     [[1 2 3]
     [4 5 6]
     [7 8 9]]
    
    Matriz transpuesta:
     [[1 4 7]
     [2 5 8]
     [3 6 9]]

    Una de las mayores ventajas de usar matrices con NumPy la obtenemos en la Multiplicación de matrices, aquí es donde NumPy destaca. La multiplicación de matrices puede ser computacionalmente costosa. Los métodos tradicionales tienen una complejidad temporal de O(n^3) para matrices de tamaño n x n. Sin embargo, NumPy utiliza algoritmos optimizados, como el algoritmo de Strassen, que reduce significativamente este costo. Si no te queda muy claro lo del calculo de complejidad puedes ampliar en este post.

    Espero hayas comprendido los temas que vimos aquí, si tienes alguna duda o comentario compártelo para aprender juntos y no olvides suscribirte para estar al pendiente de los próximos post, se vienen los Vectores, así que hasta la próxima!


    ¡Conviértete en un experto tecnológico! 🚀 Suscríbete a nuestro newsletter y recibe las últimas noticias, análisis y tendencias directamente en tu bandeja de entrada. No te pierdas las actualizaciones que harán que tu experiencia tecnológica sea aún más emocionante. ¡Únete a nuestra comunidad hoy! 📧✨

  • EXPLORANDO LAS ESTRUCTURAS DE DATOS EN PYTHON: Series y Dataframes

    EXPLORANDO LAS ESTRUCTURAS DE DATOS EN PYTHON: Series y Dataframes

    En Python, ya sea para minería de datos o trabajo con grandes volúmenes de información estructurada, el procesamiento se realiza comúnmente utilizando funciones y estructuras de datos de la biblioteca pandas. En este post nos vamos a centrar en dos estructuras de datos clave de esta librería, las series y los dataframes.

    Este es el tercer post de una serie donde hemos venido hablando de estructuras de datos aplicadas en Python. Si te has perdido el contenido anterior lo puedes ver aquí.

    Series

    En la biblioteca pandas, una Serie es un array unidimensional de valores para datos homogéneos. Podemos visualizar una Serie como una única columna en una hoja de cálculo, la cual contiene varios valores de una variable específica. En esencia, una Serie en pandas es utilizada para representar y manipular información unidimensional de manera eficiente.

    import pandas as pd
    personaje = pd.Series(['Jack',"Frost",16,True])
    print(personaje)
    
    # 0    Jack
    # 1    Frost
    # 2    16
    # 3    True

    En las estructuras de datos basadas en Series de pandas, es importante destacar el término “axis“(eje) que se utiliza para representar una secuencia de valores en una dimensión específica. La Serie tiene solo eje 0 debido a que es unidimensional. En la siguiente sección, exploraremos cómo se aplica este concepto de eje a un DataFrame.

    Dataframe

    Un DataFrame se construye sobre la estructura de datos de la Serie. Se almacena como datos tabulares bidimensionales y se utiliza para procesar datos estructurados de manera tradicional. Puedes pensar en un DataFrame como una tabla con filas y columnas, similar a una hoja de cálculo. La información se organiza en una cuadrícula donde cada fila representa una observación o registro, y cada columna representa una variable o característica específica.

    En este contexto un DataFrame ofrece una manera eficiente y flexible de trabajar con conjuntos de datos complejos, ya que cada columna es esencialmente una Serie, permite aplicar operaciones y análisis de datos de manera coherente en toda la estructura.

    pilares = pd.DataFrame([
        ['1', 'Kyojuru Rengoku', 'Llama'],
        ['2', 'Muichiro Tokito', 'Niebla'],
        ['3', 'Mitsuri Kanroji', 'Amor']])
    pilares.columns = ['id', 'nombre', 'pilar']
    print(pilares)
    id nombre pilar
    0 1 Kyojuru Rengoku Llama
    1 2 Muichiro Tokito Niebla
    2 3 Mitsuri Kanroji Amor

    En el código anterior, df.columns es una lista que especifica los nombres de las columnas. En un DataFrame, una sola columna o fila se denomina un eje.

    Entender y manipular los ejes es fundamental al trabajar con DataFrames, ya que proporciona la capacidad de acceder, indexar y realizar operaciones a lo largo de filas o columnas de manera eficiente.

    La selección de características es esencial para mejorar la eficiencia  y evitar problemas como la redundancia y la dimensionalidad excesiva. En lugar de utilizar todas las características disponibles, es común seleccionar un subconjunto relevante que contribuya significativamente al rendimiento del modelo. Puedes recuperar una columna específica por su nombre, lo cual se ilustra en el siguiente fragmento de código. Este enfoque permite trabajar de manera más selectiva con las características necesarias para una etapa particular del algoritmo, mejorando así la eficacia y la interpretación.

    pilares[['id','nombre']]
    
    id nombre
    0 1 Kyojuru Rengoku
    1 2 Muichiro Tokito
    2 3 Mitsuri Kanroji

    La disposición de una columna en un DataFrame es determinística, lo que significa que su posición está fijada de manera predecible. Puedes recuperar una columna específica no solo por su nombre, como se mencionó anteriormente, sino también por su posición dentro del DataFrame.

    Para hacer esto, puedes utilizar la notación de corchetes y proporcionar el índice numérico de la columna que deseas recuperar. Es decir, la posición de la columna en el DataFrame. Por ejemplo:

    pilares.iloc[:,2]
    # 0 Llama
    # 1 Niebla
    # 2 Amor

    En este caso, iloc es un método que se utiliza para la indexación basada en ubicación en pandas. La expresión [:, 2] significa que estás seleccionando todas las filas (:) de la tercera columna (2).

    Este enfoque de recuperación por posición es útil en situaciones en las que conoces el orden específico de las columnas y prefieres referenciarlas por su posición numérica en lugar de su nombre. Sin embargo, es crucial tener en cuenta que esta metodología depende del orden en el que se han definido las columnas en el DataFrame, ya que esa secuencia determina las posiciones.

    Cada fila en un DataFrame corresponde a un punto de datos en nuestro espacio de problemas. Si deseamos crear un subconjunto específico de los elementos de datos en nuestro espacio de problemas, es necesario realizar la selección de filas.

    La selección de filas en un DataFrame es fundamental para trabajar con conjuntos de datos extensos y centrarse en segmentos particulares que son relevantes para nuestro análisis o aplicación de algoritmos de aprendizaje automático. Hay varias formas de llevar a cabo la selección de filas en pandas:

    pilares.iloc[1:2,:]
    id nombre pilar
    1 2 Muichiro Tokito Niebla

    Una de las maneras más interesantes de selección es mediante el uso de condiciones booleanas.

    Por ejemplo, si queremos seleccionar todas las filas que cumplen con ciertos criterios, podemos utilizar una expresión condicional. Supongamos que queremos seleccionar todas las filas donde el valor en la columna “pilar” sea igual a “Lama”:

    pilares[pilares.pilar=='Llama']

    Claro, podemos utilizar cualquier condición que se pueda comparar contra los datos.

    Eso seria por ahora, dejamos este post aquí y te espero en el próximo donde hablaremos de matrices. No olvides dejar tus dudas y comentarios.


    ¡Conviértete en un experto tecnológico! 🚀 Suscríbete a nuestro newsletter y recibe las últimas noticias, análisis y tendencias directamente en tu bandeja de entrada. No te pierdas las actualizaciones que harán que tu experiencia tecnológica sea aún más emocionante. ¡Únete a nuestra comunidad hoy! 📧✨

  • Explorando las Estructuras de Datos en Python: Tuplas y Diccionarios

    Explorando las Estructuras de Datos en Python: Tuplas y Diccionarios

    Continuando nuestra ruta de estructuras de datos en Python, el segundo tipo de estructura de datos que se puede utilizar para almacenar una colección es una tupla.

    Tuplas

    A diferencia de las listas, las tuplas son estructuras de datos inmutables (de solo lectura). Las tuplas consisten en varios elementos rodeados por paréntesis ().

    Al igual que las listas, los elementos dentro de una tupla pueden ser de diferentes tipos. También permiten que sus elementos sean tipos de datos complejos. Por lo tanto, puede haber tuplas anidadas.

    vocales=('a','e','i','o','u')
    print(vocales[1])
    # 'e'
    
    print(vocales[2:]}")
    # ('i','o','u')
    
    #Tupla anidada
    mi_typla_anidada=('a',1,(3,True),8)

    Como vemos, podemos aplicar el mismo slicing que hicimos para las listas.

    Se recomienda usar estructuras de datos inmutables (como las tuplas) en lugar de estructuras de datos mutables (como las listas) siempre que sea posible, debido a cuestiones de rendimiento. Especialmente al tratar con grandes conjuntos de datos, las estructuras de datos inmutables son considerablemente más rápidas que las mutables. Cuando se pasa una estructura de datos a una función como inmutable, no es necesario crear una copia, ya que la función no puede modificarla. Esto se llama transparencia referencial y mejora el rendimiento. Aunque la capacidad de cambiar elementos de datos en listas tiene un costo, se debe analizar cuidadosamente si es realmente necesario.

    Diccionarios

    Almacenar datos como pares clave-valor es crucial, especialmente en algoritmos distribuidos. En Python, esta colección se conoce como un diccionario.

    Seleccionar una clave adecuada es esencial para identificar datos de manera eficiente durante el procesamiento. Las claves deben ser de tipos hashables(valor único y constante durante su vida útil) para garantizar su unicidad y rapidez en las búsquedas. Ejemplos de tipos hashables incluyen números enteros, cadenas de texto y tuplas.

    Los valores pueden ser de cualquier tipo, incluso listas o diccionarios anidados. Para crear un diccionario simple, solo se requiere encerrar los pares clave-valor en llaves {}.

    personaje ={
      "nombre": "Juanito",
      "apellido": "Escarcha",
      "elemento": "Agua"
    }

    Para obtener un valor asociado a una clave, se utiliza la función get o simplemente utilizar la clave como índice. Veamos como:

    personaje.get('nombre')
    
    personaje['apellido']

    Para actualizar un valor asociado a una clave lo usamos de manera similar al anterior ejemplo y “seteamos” su valor:

    personaje['elemento']="Fuego"
    print(personaje)
    
    # {'nombre': 'Juanito', 'apellido': 'Escarcha', 'elemento': 'Fuego'}

    Cuando iteramos un diccionario en Python, a menudo necesitamos tanto las claves como los valores. Fíjate en el siguiente ejemplo:

    for k,v in personaje.items():
        print(k,'->',v)
    
    # nombre -> Juanito
    # apellido -> Escarcha
    # elemento-> Fuego

    Para eliminar un elemento de un diccionario, utilizaremos la función del.

    del personaje['elemento']
    print(personaje)
    
    # {'nombre': 'Juanito', 'apellido': 'Escarcha'}

    Sets

    Estrechamente relacionado con un diccionario está un conjunto, que se define como una colección desordenada de elementos distintos que pueden ser de diferentes tipos. Una de las formas de definir un conjunto es encerrar los valores entre llaves { }. Si un valor esta duplicado en este conjunto lo omitirá.

    colores={'blanco','negro'}

    Por ahora hemos llegado al final, pero aun nos falta estructuras por revisar, así que suscríbete y comparte este blog con tus compañeros de programación y amigos interesados en Python.

    ¡Gracias por ser parte de nuestra comunidad! ¡Esperamos con entusiasmo tus comentarios y contribuciones!


    ¡Conviértete en un experto tecnológico! 🚀 Suscríbete a nuestro newsletter y recibe las últimas noticias, análisis y tendencias directamente en tu bandeja de entrada. No te pierdas las actualizaciones que harán que tu experiencia tecnológica sea aún más emocionante. ¡Únete a nuestra comunidad hoy! 📧✨

  • Explorando las Estructuras de Datos en Python: LISTAS

    Explorando las Estructuras de Datos en Python: LISTAS

    Las estructuras de datos en memoria desempeñan un papel crucial al almacenar datos temporales durante la ejecución. La elección de las estructuras de datos adecuadas es fundamental para lograr implementaciones eficientes. Algunas clases de algoritmos son recursivas o iterativas en lógica y requieren estructuras de datos especialmente diseñadas para ellas. Por ejemplo, un algoritmo recursivo puede implementarse de manera más sencilla, exhibiendo un mejor rendimiento, si se utilizan estructuras de datos anidadas. En este post, exploraremos las estructuras de datos en el contexto de los algoritmos, centrándonos en las que ofrece Python. Sin embargo, los conceptos presentados aquí son aplicables a otros lenguajes como Java y C++.

    Python y sus Tipos de Datos Integrados

    En cualquier lenguaje, las estructuras de datos son fundamentales para almacenar y manipular datos complejos. En Python, las estructuras de datos son contenedores de almacenamiento que permiten gestionar, organizar y buscar datos de manera eficiente. Estas estructuras se utilizan para almacenar grupos de elementos de datos denominados colecciones que deben ser almacenados y procesados conjuntamente.

    Listas

    Una secuencia ordenada, posibilidad de anidamiento y mutabilidad de elementos

    Una lista es una estructura de datos que permite almacenar una secuencia de elementos que pueden ser modificados. La característica principal de las listas es que los elementos no necesitan ser del mismo tipo. Puedes definir una lista encerrando los elementos entre corchetes [] y separándolos por comas. Por ejemplo, el siguiente código crea una lista con cuatro elementos de tipos diferentes:

    mi_lista = [19, 'Python', 1.76, True]

    Indexación de Listas: La posición de un elemento es determinística en una lista, el índice se puede utilizar para obtener un elemento de una posición específica, ten en cuenta que Python es un lenguaje de indexación desde cero.

    print(mi_lista[2])
    # [1.76]

    Slicing de listas: Obtener un subconjunto de los elementos de una lista especificando un rango de índices se llama slicing.

    Al realizar un slicing de una lista, el rango se indica de la siguiente manera: el primer número (inclusivo) y el segundo número (exclusivo). También contamos con índices negativos, los cuales cuentan desde el final de la lista.

    print(mi_lista[0:2])
    # [19, 'Python']
    
    print(mi_lista[2:])
    # [1.76, True]
    
    print(mi_lista[:3])
    # [19, 'Python', 1.76]
    
    print(mi_lista[:-1])
    # [19, 'Python', 1.76]
    
    print(mi_lista[-2:-1])
    # [1.76]

    Anidamiento: Ya que un elemento de una lista puede ser de cualquier tipo de dato podemos anidar listas. Para algoritmos iterativos y recursivos, esto proporciona capacidades importantes.

    mi_lista = [19, 'Python', [12, 'a', 'b'], 1.76, True]

    Iteración: Python permite iterar sobre cada elemento de una lista utilizando un bucle for. Si quieres profundizar tengo un post sobre estructuras de programación.

    lenguajes = ['Python', 'Java', 'GO', 'COW']
    for lenguaje in lenguajes:
        print(lenguaje)
    
    # Python
    # Java
    # GO
    # COW

    Añadir elementos con append(): Cuando deseas insertar un nuevo elemento al final de una lista, utilizas el método append(). Si la lista ya está en su capacidad máxima, Python extiende la asignación de memoria.

    lenguajes.append('C#')
    print(lenguajes)
    
    # ['Python', 'Java', 'GO', 'COW', 'C#']

    Eliminar elementos con pop(): Para extraer un elemento de la lista, se llama este método que extrae el elemento especificado (o el último elemento si no se proporciona un índice). Los elementos situados después del elemento extraído se reposicionan para mantener la continuidad de la memoria:

    lenguajes.pop()
    print(lenguajes)
    
    # ['Python', 'Java', 'GO', 'COW']

    El método range(): Se utiliza para autocompletar secuencias de números en una lista. Su uso es simple, podemos utilizarla especificando la cantidad de elementos que queremos en la lista, por defecto comienza desde cero e incrementa de uno en uno, pero esto es parametrizable.

    lista = range(5)
    print(lista)
    
    # [0, 1, 2, 3, 4]
    
    lista2 = range(3,20,2)
    print(lista2)
    
    # [3, 5, 7, 9, 11, 13, 15, 17, 19]

    Las listas son compañeras esenciales para cualquier desarrollador, facilitando la manipulación y gestión de datos, pero la aventura no termina aquí. ¡Prepárense para nuestro próximo destino: las tuplas! Las tuplas son otro concepto emocionante que exploraremos en nuestro próximo post.

    ¿Tienes preguntas, comentarios o dudas sobre las listas en Python? ¡Déjalos en la sección de comentarios! Estamos aquí para ayudarte y profundizar en estos temas juntos. ¡Hasta la próxima, y no olviden suscribirse para no perderse ninguna entrega de nuestro viaje por el mundo de Python! Happy coding! 🚀🐍


    ¡Conviértete en un experto tecnológico! 🚀 Suscríbete a nuestro newsletter y recibe las últimas noticias, análisis y tendencias directamente en tu bandeja de entrada. No te pierdas las actualizaciones que harán que tu experiencia tecnológica sea aún más emocionante. ¡Únete a nuestra comunidad hoy! 📧✨

¡Hola a todos los entusiastas de la tecnología! Quería informarles que en mi blog utilizamos cookies para mejorar la experiencia de usuario. Estas pequeñas herramientas nos ayudan a personalizar el contenido y ofrecer funciones específicas. Al continuar explorando el sitio, aceptas nuestro uso de cookies. Puedes obtener más información sobre cómo las utilizamos en nuestra política de privacidad. ¡Gracias por ser parte de esta comunidad tecnológica! 🍪    Más información
Privacidad