Autor Tema: Python numpy y cuadrados mágicos

0 Usuarios y 1 Visitante están viendo este tema.

07 Junio, 2021, 02:48 am
Leído 5144 veces

Soofiaa

  • $$\Large \color{#6a84c0}\pi$$
  • Mensajes: 51
  • País: cl
  • Karma: +0/-0
  • Sexo: Femenino
Buen día, me podrían echar una manito para hacer este ejercicio con python?
________________________
Todo cuadrado mágico básico de orden \( n \) tiene la misma constante "mágica", por lo que sin ambigüedad la podemos denotar por \( k_n = \displaystyle\frac{n(n^2 +1)}{2} \).
Escribir un programa que tome una matriz cuadrada (arreglo de Numpy) y verifique si esta es o no un cuadrado mágico básico.

07 Junio, 2021, 03:03 am
Respuesta #1

mathtruco

  • Moderador Global
  • Mensajes: 5,598
  • País: cl
  • Karma: +0/-0
  • Sexo: Masculino
  • El gran profesor inspira
Hola Soofíaa. La idea acá no es hacer las tareas de otros, sino resolver dudas específicas. La tarea que debes hacer está muy bonita, ya que el programa es sencillo, sólo debes automatizarlo.

Debes hacer un programa que haga lo siguiente:

1. Que lea una matriz cuadrada. Te sugiero que la matriz sea un archivo (por ejemplo, llamado matriz1.txt, matriz2.txt, etc). Con eso será más fácil hacer pruebas.

2. Una vez leída la matriz debes:

    - Sumar los elementos de cada fila y verificar que cada suma es igual a a la constante mágica. Acá te sugiero no partir con el programa general.
    - Sumar los elementos de cada diagonal y verificar que cada suma es igual a la constante mágica.


Te sugiero que siempre que debas hacer un programa general escribas el algoritmo como el que escribí (paso 1: hacer esto, paso 2: hacer otra cosa...). Nunca partas escribendo el programa general. Date un ejemplo de una matriz de 3x3 y haz el programa así sin ciclos ni nada. Con eso claro, con el ejemplo pequeño claro, ya tendrás claro como hacerlo de forma general.

------------------

Si quieres escribe el programa que hagas siguiendo estas instrucciones y entre todos lo revisamos. Si a medida que escribas el programa te surgen dudas específcas nos preguntas.

P.D. Busqué en google "read matrix numpy", y con eso:

Código: [Seleccionar]
import numpy as np
M = np.loadtxt('matriz1.txt')
A.view()

Desde acá debe ser fácil continuar.

07 Junio, 2021, 11:43 am
Respuesta #2

feriva

  • $$\Large \color{#a53f54}\pi\,\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 12,032
  • País: es
  • Karma: +1/-0
  • Sexo: Masculino
Buen día, me podrían echar una manito para hacer este ejercicio con python?
________________________
Todo cuadrado mágico básico de orden \( n \) tiene la misma constante "mágica", por lo que sin ambigüedad la podemos denotar por \( k_n = \displaystyle\frac{n(n^2 +1)}{2} \).
Escribir un programa que tome una matriz cuadrada (arreglo de Numpy) y verifique si esta es o no un cuadrado mágico básico.

Otra recomendación.

Te sugiero que uses un input para que el usuario meta los datos, porque si pones una función random va a a ser un rollo hasta que salga por suerte alguna matriz mágica.

Primero pones el input del “n” y, cuando se tenga, mediante la fórmula, el programa calcula la constante y la guarda en una variable.

Seguidamente, mediante el “n”, pones otro input con un bucle “for” para ir metiendo los datos a través del teclado, los números de cada fila. Como te piden hacerlo con Numpy, pues tendrás que usar algo así
 M=np.array([[a11,a12...],[a2,1, a22...]...])

Yo, el Numpy no lo he usado casi, eso ya lo ves tú.

Para terminar, con unos bucles más (que puedes poner en una función o como tú veas) compruebas mediante la función “sum” si las filas suman la constante; y en cuanto no dé el resultado, mediante un “if” haces un “break” y que imprima que “NO”. Luego, el programa tiene que trasponer la matriz M y volver a sumar las filas haciendo la comprobación; y finalmente comprueba las dos diagonales principales.

Saludos.

07 Junio, 2021, 03:53 pm
Respuesta #3

mathtruco

  • Moderador Global
  • Mensajes: 5,598
  • País: cl
  • Karma: +0/-0
  • Sexo: Masculino
  • El gran profesor inspira

Otra recomendación.

Te sugiero que uses un input para que el usuario meta los datos, porque si pones una función random va a a ser un rollo hasta que salga por suerte alguna matriz mágica.

Primero pones el input del “n” y, cuando se tenga, mediante la fórmula, el programa calcula la constante y la guarda en una variable.


Sigo pensando que la idea que propuse, que la matriz esté guardada en un archivo matriz1.txt, es mejor a que el usuario deba ingresar uno a uno los valores de la matriz. Ya en en este último caso se perderá mucho tiempo ingresando valores para hacer pruebas, especialmente si se quiere hacer pruebas para matrices grandes, y sumado a la posibilidad de cometer errores.
Cargada la matriz, con len(M) puedes saber el orden.


Luego, el programa tiene que trasponer la matriz M y volver a sumar las filas haciendo la comprobación; y finalmente comprueba las dos diagonales principales.


Eso de trasponer la matriz me parece una gran idea, no se me había ocurrido.

07 Junio, 2021, 06:44 pm
Respuesta #4

feriva

  • $$\Large \color{#a53f54}\pi\,\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 12,032
  • País: es
  • Karma: +1/-0
  • Sexo: Masculino

Sigo pensando que la idea que propuse, que la matriz esté guardada en un archivo matriz1.txt, es mejor a que el usuario deba ingresar uno a uno los valores de la matriz. Ya en en este último caso se perderá mucho tiempo ingresando valores para hacer pruebas, especialmente si se quiere hacer pruebas para matrices grandes, y sumado a la posibilidad de cometer errores.
Cargada la matriz, con len(M) puedes saber el orden.


Sí, estoy de acuerdo, es mejor; es que yo no lo he usado nunca, pero seguro que va muy bien.

Gracias, mathtruco.

07 Junio, 2021, 10:39 pm
Respuesta #5

mathtruco

  • Moderador Global
  • Mensajes: 5,598
  • País: cl
  • Karma: +0/-0
  • Sexo: Masculino
  • El gran profesor inspira

Sigo pensando que la idea que propuse, que la matriz esté guardada en un archivo matriz1.txt, es mejor a que el usuario deba ingresar uno a uno los valores de la matriz. Ya en en este último caso se perderá mucho tiempo ingresando valores para hacer pruebas, especialmente si se quiere hacer pruebas para matrices grandes, y sumado a la posibilidad de cometer errores.
Cargada la matriz, con len(M) puedes saber el orden.


Sí, estoy de acuerdo, es mejor; es que yo no lo he usado nunca, pero seguro que va muy bien.

Gracias, mathtruco.

Es una práctica que aplico independiente del lenguaje de programación. Eso de estar ingresando valores por teclado para testear es fuente de errores y además una pérdida de tiempo (cuando los valores de entrada son más de uno, claro). Pero como todo en programación, queda a gusto de consumidor.

08 Junio, 2021, 07:52 am
Respuesta #6

ingmarov

  • Moderador Global
  • Mensajes: 5,428
  • País: hn
  • Karma: +0/-0
  • Sexo: Masculino
Hola

No sé si se podrá hacer más fácil, pero, dejo algunas ideas o sugerencias.

Luego de tener ingresado el cuadrado y convertido en una matriz se deberá:
-Revisar que no hay números repetidos,  lo usual es que los números utilizados sean consecutivos y estén entre 1 y n².
-Calcular la constante \( k_n \).
-Comprobar que la suma de renglones, columnas y diagonales sean iguales a \( k_n \).

Dado que los renglones de una matriz están agrupados será fácil hacer la suma de cada renglón, por ejemplo para sumar el primer renglón se puede escribir matriz[0].sum()

Para hacer las sumas de las columnas conviene transponer la matriz    matriz.transpose()

Para la matriz diagonal principal basta con matriz.trace()

Para la otra diagonal puedes hacerlo así np.flipud(matriz).diagonal().sum()

Si todas las sumas cumplen la igualdad, el cuadrado es un cuadrado mágico y se debe indicar imprimiendo un mensaje en pantalla. Si alguna de las sumas no es igual a k el programa se debe detener y mostrar el mensaje (por ejemplo) "Los datos no corresponden a un cuadrado mágico".


Saludos
No te confíes, revisa lo que escribo. Yo también me equivoco.
Odio el autocorrector de Android...

08 Junio, 2021, 10:28 am
Respuesta #7

feriva

  • $$\Large \color{#a53f54}\pi\,\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 12,032
  • País: es
  • Karma: +1/-0
  • Sexo: Masculino
Hola, Ingmarov.

Para la otra diagonal puedes hacerlo así np.flipud(matriz).diagonal().sum()

Se me ocurre también así: matriz[::-1] y después matriz.trace()

Saludos.

08 Junio, 2021, 07:59 pm
Respuesta #8

ingmarov

  • Moderador Global
  • Mensajes: 5,428
  • País: hn
  • Karma: +0/-0
  • Sexo: Masculino
Hola feriva   :)

Hola, Ingmarov.

Para la otra diagonal puedes hacerlo así np.flipud(matriz).diagonal().sum()

Se me ocurre también así: matriz[::-1] y después matriz.trace()

Saludos.

Sí, también se puede hacer en una linea matriz[::-1].trace()

Saludos
No te confíes, revisa lo que escribo. Yo también me equivoco.
Odio el autocorrector de Android...

08 Junio, 2021, 08:55 pm
Respuesta #9

mathtruco

  • Moderador Global
  • Mensajes: 5,598
  • País: cl
  • Karma: +0/-0
  • Sexo: Masculino
  • El gran profesor inspira
Yo creo que Soofíaa está recién aprendiendo a programar, por lo que supongo que la intención del ejercicio es resolver el ejercicio con ciclos for y sentencias if, evitando funciones del lenguaje. Aunque por otro lado le piden usar numpy, así que quizás sí pueda usar las características de la biblioteca. De cualquier modo, yo le recomendaría resolver el ejercicio sólo usando for e if, y después ver cómo resolver el problema usando cosas de numpy.

Justamente por este motivo encuentro una pésima idea que Python sea elegido como primer lenguaje de programación para un estudiante, porque se les hace un enredo de qué es programar y qué es un comando de Python. Pero la mayoría cree que Python es un gran primer lenguaje de programación, así que el equivocado debo ser yo.