Ayuda programacion Python
La vida al margen del deporte (la hay)

Trasgus.
Mensajes: 29173
Registrado: 15 Nov 2005, 20:56

Ayuda programacion Python

por Trasgus. » 21 May 2018, 11:15

¿Algún informático con nociones de programación en Python en la sala?

Necesito una pequeña ayudita porque no llevo manera a resolver este problema y no encuentro información en la red de como implementar el código.

El problema es sencillo, necesito crear un array tridimensional y rellenarlo con los datos del movimiento de una partícula sin utilizas bucles, que esa es mi jodienda, que a mí me quitan los bucles y me pierdo

Código: Seleccionar todo


from numpy import *

def coordenadas (E,q,t,m,B):
    x=q*E*t**2/(2*m)
    y=q**2*E*B*t**3/(6*m**2)
    posicion=zeros((2,1),float)  #matriz de ceros con dos filas y una columna
    return array([x,y]).T

#Datos:
m=1.0     #kg
B=0.1   #T
E=5.0

hojas=5
tiempos=10
q=arange(1,hojas,1)
t=linspace(0,9,tiempos)

mat3=zeros((hojas,tiempos,2))
for i in range(0,hojas-1):
    mat3[i]=coordenadas(E,q[i],t,m,B)
La cosa es que tengo que usar la función coordenadas simultáneamente con los arrays q y t de manera de que el array tridimensional sea de la siguiente forma

Primera hoja q[o] y la función se realice para todo el array t
Segunda hoja q[1] y la función se realice para todo el array t
...
Así hasta completar el array q

Es decir, tengo que hacer lo mismo que hace el programa, pero sin usar ese bucle for, puedo vectorizar la función, puedo modificar los bucles y puedo modificar la llamada de la función, ¿alguien puede ayudarme?
Última edición por Trasgus. el 21 May 2018, 11:50, editado 1 vez en total.

Siddhartha
Mensajes: 18184
Registrado: 13 Sep 2009, 15:08

Re: Ayuda programacion Python

por Siddhartha » 21 May 2018, 11:42

Lo que entiendo de tu codigo es, que tienes una funcion que genera un array y los inputs son: E y m son integers, B float y t y q son vectores.

Lo que no entiendo bien son varias cosas:
-Una tonteria -- porque introduces E como E[0] si E = 5
-Y una muy importante -- No comprendo bien porque no puedes utilizar el bucle for?
puedes hacer un bucle dentro de otro bucle o si los arrays se computan en paralelo utilizar zip.

No se igual si lo explicas mas detalladamente te puedo ayudar.
Imagen

Trasgus.
Mensajes: 29173
Registrado: 15 Nov 2005, 20:56

Re: Ayuda programacion Python

por Trasgus. » 21 May 2018, 11:49

mierda, tengo que modificarlo.

El problema original, es hacer un array tetradimensional (hay un array tambien de E), pero para simplificar la pregunta al foro me tire al tridimensional y si alguien me responde la pregunta, pues supongo que me las apañaria para hacer la cuarta dimension, pero al eliminar el array E, no me acorde de modicar la llamada de la funcion.

Las variables pueden ser todas float

No puedo usar los bucles, porque el profesor nuevo no les deja a mis alumnas usar bucles, dice que los bucles son muy lentos.

Siddhartha
Mensajes: 18184
Registrado: 13 Sep 2009, 15:08

Re: Ayuda programacion Python

por Siddhartha » 21 May 2018, 11:59

La verdad es que no se me ocurre como poder hacerlo sin utilizar ningun bucle for.

Lo unico que se me ocurre es que si los arrays tienen la misma dimension puedes introducirlos en la funcion tal cual.
O añadir el bucle for dentro de la funcion y evaluar cada q para todo t.

Tienes el enunciado completo del problema? Segun parece das clases particulares o en academia, no? jeje yo tambien hice eso durante un tiempo.
Si puedes mandame el problema completo. Intentare ayudarte.
Imagen

Trasgus.
Mensajes: 29173
Registrado: 15 Nov 2005, 20:56

Re: Ayuda programacion Python

por Trasgus. » 21 May 2018, 12:09

Si, ejejeje, estoy en una academia, el problema es que no soy informatico, aunque que se me da bien la programacion, asi que con las asignaturas de primero me atrevo, pero a veces me meto en estos berenjenales cuando me cambian la programacion y en este especialmente, no encuentro a nadie por internet que me lo solucione

Los arrays no tienen la misma dimension.

Enunciado del examen
Imagen

Muchas gracias por dedicarme tu tiempo

Roderic
Mensajes: 31847
Registrado: 18 Oct 2011, 00:58
Ubicación: Cuñado Cum Laude

Re: Ayuda programacion Python

por Roderic » 21 May 2018, 12:26

te dejan usar la "list comprehension" o tampoco cuela?

Yo crearía cada uno de los arrays de las magnitudes que varían en la dimensión pertinente y usaría el numpy.tile para replicar el array en las dimensiones donde no varía para cada magnitud; luego realizas la operación y te quedas con el array 4-dimensional del resultado final. Posiblemente haga falta un shift o algo pero así a bote pronto no sé si ya el tile deja cada array en la dimensión adecuada.

Hace tiempo hice una movida así con 5 dimensiones si mal no recuerdo, algo más complejo además porque tuve que hacer funciones ad hoc para simplificar algunas operaciones comunes con dimensiones que el numpy no tenía por defecto
Última edición por Roderic el 21 May 2018, 12:45, editado 2 veces en total.
baaarliin escribió:Dejad a las chicas en paz, en serio, no seáis putos pesados. Mejor morir solo que ser un jodido plasta.

Trasgus.
Mensajes: 29173
Registrado: 15 Nov 2005, 20:56

Re: Ayuda programacion Python

por Trasgus. » 21 May 2018, 12:28

tampoco cuela

Roderic
Mensajes: 31847
Registrado: 18 Oct 2011, 00:58
Ubicación: Cuñado Cum Laude

Re: Ayuda programacion Python

por Roderic » 21 May 2018, 12:38

No sé si puedes aprovechar el broadcasting de Python porque no he calculado las dimensiones de los arrays pero igual podrías componerlos de esa forma tb en lugar de crear arrays de 4 dimensiones todos iguales

En este último caso podrías expandir las dimensiones paso a paso en diferentes etapas de la multiplicación usando reshape

Por ejemplo tienes el array A que es (N,) y haces reshape para tener un array 2d (N,1). Luego lo multiplicas por el array B que es (M,) y lo traspones o haces un shift para tenerlo (1,M) y los multiplicas para tener el resultado parcial A*B de dimensiones (N,M).

Luego ese resultado parcial lo expandes con el reshape para que sea (N,M,1) y el siguiente array que multiplicas, C de dimension (P,) lo conviertes en (1,1,P) para que al multiplicar A*B*C te queden dimensiones (N,M,P) y así sucesivamente.


PD: son todo alumnas en esa clase? :O
baaarliin escribió:Dejad a las chicas en paz, en serio, no seáis putos pesados. Mejor morir solo que ser un jodido plasta.

Trasgus.
Mensajes: 29173
Registrado: 15 Nov 2005, 20:56

Re: Ayuda programacion Python

por Trasgus. » 21 May 2018, 12:44

Este es el codigo que tengo para generar con bucles el array tetradimensional.

Código: Seleccionar todo

#coding:utf-8
from numpy import *

def coordenadas (E,q,t,m,B):
    x=q*E*t**2/(2*m)
    y=q**2*E*B*t**3/(6*m**2)
    posicion=zeros((2,1),float)  #matriz de ceros con dos filas y una columna
                                 #en la primera fila almaceno la x
                                 #en la segunda fila almaceno la y
    return array([x,y]).T
#Datos:
m=1     #kg
B=0.1   #T


tiempos=33
t=linspace(0,9,tiempos)
E=arange(5,12,1.2)
q=arange(1,10,1)
cap=size(E)
hoj=size(q)

mat4=zeros((cap,hoj,tiempos,2),float)
for i in range(0,cap):
    for j in range(0,hoj):
        mat4[i,j]=coordenadas(E[i],q[j],t,m,B)
print mat4
Pero yo no he hecho esto sin bucléh en mi vida hujio

Roderic
Mensajes: 31847
Registrado: 18 Oct 2011, 00:58
Ubicación: Cuñado Cum Laude

Re: Ayuda programacion Python

por Roderic » 21 May 2018, 12:48

Léete lo que te he puesto arriba, con numpy.reshape y numpy.roll deberías ser capaz de hacer multiplicaciones adecuando las dimensiones de los arrays

Aquí el broadcasting en toda su gloria https://docs.scipy.org/doc/numpy-1.13.0 ... sting.html
baaarliin escribió:Dejad a las chicas en paz, en serio, no seáis putos pesados. Mejor morir solo que ser un jodido plasta.

Trasgus.
Mensajes: 29173
Registrado: 15 Nov 2005, 20:56

Re: Ayuda programacion Python

por Trasgus. » 21 May 2018, 12:52

Roderic escribió:No sé si puedes aprovechar el broadcasting de Python porque no he calculado las dimensiones de los arrays pero igual podrías componerlos de esa forma tb en lugar de crear arrays de 4 dimensiones todos iguales

En este último caso podrías expandir las dimensiones paso a paso en diferentes etapas de la multiplicación usando reshape

Por ejemplo tienes el array A que es (N,) y haces reshape para tener un array 2d (N,1). Luego lo multiplicas por el array B que es (M,) y lo traspones o haces un shift para tenerlo (1,M) y los multiplicas para tener el resultado parcial A*B de dimensiones (N,M).

Luego ese resultado parcial lo expandes con el reshape para que sea (N,M,1) y el siguiente array que multiplicas, C de dimension (P,) lo conviertes en (1,1,P) para que al multiplicar A*B*C te queden dimensiones (N,M,P) y así sucesivamente.


PD: son todo alumnas en esa clase? :O
mmmm, voy a mirar esta, podria crear un array tridimensional que envio a la funcion e igual asi funciona.

A lo segundo, si, este grupo son 7 chicas de 18 años mas preocupadas en ir de compras que en estudiar programacion.

Roderic
Mensajes: 31847
Registrado: 18 Oct 2011, 00:58
Ubicación: Cuñado Cum Laude

Re: Ayuda programacion Python

por Roderic » 21 May 2018, 12:54

también pensándolo un poco podrías crear directamente 4 arrays tetradimensionales donde las dimensiones de cada uno son: (dim1,1,1,1) (1,dim2,1,1) (1,1,dim3,1) (1,1,1,dim4) y multiplicar de una sola vez

Para hacer esto creo que con reshape te basta y sobra pero tendría que mirarlo. Con Matlab por ejemplo no sirve y habría que crear réplicas de cada array donde las dimensiones de cada uno serían (dim1,dim2,dim3,dim4) para los cuatro arrays aunque solo variasen en una dimensión respectivamente. En Python se simplifica ese concepto porque va implícito en el llamado broadcasting
baaarliin escribió:Dejad a las chicas en paz, en serio, no seáis putos pesados. Mejor morir solo que ser un jodido plasta.

Roderic
Mensajes: 31847
Registrado: 18 Oct 2011, 00:58
Ubicación: Cuñado Cum Laude

Re: Ayuda programacion Python

por Roderic » 21 May 2018, 12:58

Imagen
baaarliin escribió:Dejad a las chicas en paz, en serio, no seáis putos pesados. Mejor morir solo que ser un jodido plasta.

Trasgus.
Mensajes: 29173
Registrado: 15 Nov 2005, 20:56

Re: Ayuda programacion Python

por Trasgus. » 21 May 2018, 12:58

Va a ser por ahi la solucion Roderic, porque broadcasting es parte importante del temario, y en el examen no hay pregunta alguna directamente sobre el.

Mil gracias

Trasgus.
Mensajes: 29173
Registrado: 15 Nov 2005, 20:56

Re: Ayuda programacion Python

por Trasgus. » 21 May 2018, 13:05

Roderic escribió:Imagen
Que va, hoy en dia, las chicas son tan desastres como los chicos.

hace unas semanas me lleve las manos a la cabeza cuando entre las 7 dijeron que no sabian freir un huevo, y no me llevo porque son mujeres, sino por inutilidad en las que crian a los adolescentes, a los que para ellos cocinar es meter en el microondas o en el horno un ultracongelado

Por cierto, el peor (mejor) trabajo que vi es de una chica, que direcamente la portada era asi

PROCESOS
ENERGET
ICOS

Asi, con dos ovarios, en el titulo la palabra energeticos separa en dos lineas, porque ella puso letra 72 y en 72 se quedo, el trabajo por dentro de una delicia de copypaste de internet cada uno a una letra y tamaño diferente y en los que se notaban los pantallazos por las sombras del fondo, brutal, nos estuvimos riendo meses.

Siddhartha
Mensajes: 18184
Registrado: 13 Sep 2009, 15:08

Re: Ayuda programacion Python

por Siddhartha » 21 May 2018, 13:15

La verdad es que si leeis bien el enunciado del examen esta muy claro los pasos que hay que dar.

Crea la funcion, genera los arrays, cambia la forma de los arrays para que puedan ser utilizados en la funcion.
La funcion debe devolver un array result = [E, q, t, [x,y]].

La clave esta en leer bien el enunciado.

Ah y al funcion lleva un par de datos por defecto, asi que se llamara coordenadas(E, t, m = 1, B = 0.1)

Suerte
Imagen

Trasgus.
Mensajes: 29173
Registrado: 15 Nov 2005, 20:56

Re: Ayuda programacion Python

por Trasgus. » 23 May 2018, 23:32

Siddhartha escribió:
.
Roderic escribió:
¡¡Pues muchas gracias a los dos!!

Me acabo de poner con ello y aqui tengo el resultado.

He creado un nuevo enunciado que me sera mas facil para poder explicar el ejercicio calculando el volumen de un hexaedro y la suma de sus tres lados variando los lados de la siguiente forma

c=10 20 30 (seria la profundidad)
b=2 4 6 8 10
a=1 2 3 4 5

he conseguido con el broadcasting hacer un array en la cual la primera dimension son los valores C, la siguiente los de B y la penultima los de A y operando en dos columnas el volumen y la suma de los lados

He aqui el resultado

Código: Seleccionar todo

from numpy import *

def funcion (a,b,c):
    return array([a*b*c,a+b+c]).T
a=arange(10,31,10)
b=arange(2,10,2)
c=arange(1,6,1)
tama=size(a)
tamb=size(b)
tamc=size(c)
print "a: ",a
print "b: ",b
print "c: ",c

nb=b.reshape(tamb,1)
unos2D=ones((tamb,tamc),float)
nb=unos2D*nb
nb=nb

nc=c.reshape(tamc,1)
unos2D=ones((tamb,tamc),float)
nc=unos2D*nc.T
nc=nc
print "nb"
print nb
print "nc"
print nc

unos3D=ones((tama,tamb,tamc),float)
nnb=nb.reshape(1,tamb,tamc)
nnb=nnb*unos3D
nnc=nc.reshape(1,tamb,tamc)
nnc=nnc*unos3D

print "nnb"
print nnb
print "nnc"
print nnc

nna=a.reshape(tama,1,1)
nna=nna*unos3D

print "nna"
print nna

total=size(nna)
a1D=nna.reshape(total)
b1D=nnb.reshape(total)
c1D=nnc.reshape(total)

print a1D
print b1D
print c1D

print "volumen / suma de los lados"
mat=funcion (a1D,b1D,c1D)
print mat
print mat.reshape(tama,tamb,tamc,2)
Y este es el array obtenido

Código: Seleccionar todo

[[[[   20.    13.]
   [   40.    14.]
   [   60.    15.]
   [   80.    16.]
   [  100.    17.]]

  [[   40.    15.]
   [   80.    16.]
   [  120.    17.]
   [  160.    18.]
   [  200.    19.]]

  [[   60.    17.]
   [  120.    18.]
   [  180.    19.]
   [  240.    20.]
   [  300.    21.]]

  [[   80.    19.]
   [  160.    20.]
   [  240.    21.]
   [  320.    22.]
   [  400.    23.]]]


 [[[   40.    23.]
   [   80.    24.]
   [  120.    25.]
   [  160.    26.]
   [  200.    27.]]

  [[   80.    25.]
   [  160.    26.]
   [  240.    27.]
   [  320.    28.]
   [  400.    29.]]

  [[  120.    27.]
   [  240.    28.]
   [  360.    29.]
   [  480.    30.]
   [  600.    31.]]

  [[  160.    29.]
   [  320.    30.]
   [  480.    31.]
   [  640.    32.]
   [  800.    33.]]]


 [[[   60.    33.]
   [  120.    34.]
   [  180.    35.]
   [  240.    36.]
   [  300.    37.]]

  [[  120.    35.]
   [  240.    36.]
   [  360.    37.]
   [  480.    38.]
   [  600.    39.]]

  [[  180.    37.]
   [  360.    38.]
   [  540.    39.]
   [  720.    40.]
   [  900.    41.]]

  [[  240.    39.]
   [  480.    40.]
   [  720.    41.]
   [  960.    42.]
   [ 1200.    43.]]]]
Tengo que pulirlo, porque creo que doy demasiadas vueltas con el reshape y el broadcasting, pero es que primero quise crear uno en el cual no fuera necesario variar c y si a y b par facilitar la explicacion en clase y a partir de ese crear el del examen.

Muchas gracias otra vez!

Que Dios os lo pague con muchos hijos

Roderic
Mensajes: 31847
Registrado: 18 Oct 2011, 00:58
Ubicación: Cuñado Cum Laude

Re: Ayuda programacion Python

por Roderic » 24 May 2018, 00:14

Creo que los arrays de unos sobran

Código: Seleccionar todo


a=arange(10,31,10)
b=arange(2,10,2)
c=arange(1,6,1)
tama=size(a)
tamb=size(b)
tamc=size(c)
a=a.reshape(tama,1,1)
b=b.reshape (1,tamb,1)
c=c.reshape(1,1,tamc)

#volumen
V=a*b*c
#suma de lados
S=a+b+c

Última edición por Roderic el 24 May 2018, 00:22, editado 1 vez en total.
baaarliin escribió:Dejad a las chicas en paz, en serio, no seáis putos pesados. Mejor morir solo que ser un jodido plasta.

Trasgus.
Mensajes: 29173
Registrado: 15 Nov 2005, 20:56

Re: Ayuda programacion Python

por Trasgus. » 24 May 2018, 00:21

Creo que tienes razon, tengo que probarlo, aun asi, de mano lo dejo asi, porque me resulta mas comodo para explicar, que al final es lo importante

Roderic
Mensajes: 31847
Registrado: 18 Oct 2011, 00:58
Ubicación: Cuñado Cum Laude

Re: Ayuda programacion Python

por Roderic » 24 May 2018, 00:24

es una explicacion mala a mi juicio

Aparte que es eso de nb=nb??

Las vas a liar de cojones si haces arrays auxiliares de unos que no son necesarios.
baaarliin escribió:Dejad a las chicas en paz, en serio, no seáis putos pesados. Mejor morir solo que ser un jodido plasta.

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 3 invitados

Fecha actual 19 Abr 2024, 17:01