Python - No consigo arrancar con Python.

 
Vista:
sin imagen de perfil

No consigo arrancar con Python.

Publicado por Deo (7 intervenciones) el 14/11/2015 00:49:17
Las 'sutilezas' de Python me traen por la calle de la amargura.
Me gustaría saber que falla en el siguiente código. ¿Podríais echarlo un ojo?

¿Porque no suma los valores float de ix[i] a x[i]?
¿No deberían re-definirse los (int) x como float ?

1
2
3
4
5
6
7
x  = arange(100)             # asigno valores 0 .. 99
ix = random(100)            # y valores aleatorios 0..1
                                           # y quisiera sumarlos...
for i in range(1,100):
    x[i] = x[i-1] + ix[i]         #  o simplemente:  x[i] = ix[i]
x                                       # imprimir x
                                         # pero, ¿¿  porque no se asignan los valores FLOAT de ix???

¿Acaso no se pueden redefinir los valores de x?

Alguna sugerencia para 'vectorizar' la operación directamente evitando el 'for'?
Muchas gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de xve
Val: 2.239
Plata
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

No consigo arrancar con Python.

Publicado por xve (1646 intervenciones) el 14/11/2015 09:40:56
Hola Deo, este código te funciona?? no te da ningun error?

Yo lo he probado y me da errores...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

No consigo arrancar con Python.

Publicado por Deo (7 intervenciones) el 14/11/2015 17:26:27
Hola xve, Gracias por tu interés.
Quizás he ido muy rápido y no he dicho que hay que importar 'numpy' .
Yo tenia importada 'numpy' y 'pylab' (para ramdom(100), que creo que viene siendo igual a numpy.random.rand(100))
Asi pues las instrucciones serían:

1
2
3
4
5
6
7
8
import numpy
from numpy import *
x  = arange(100)
ix = random.rand(100)
# y para sumarlos
for i in range(1,100):
    x[i] = x[i-1] + ix[i]
x  # muestra el resultado: todo ceros ¿?

Yo lo incluyo en el interprete online de Jutyter:
try.jupyter.org >> new/Python 3 >>... Ctrl+Enter (para ejecutar cada entrada)

Nota: x = arange(100) es solo para coger sitio, no importan los valores ¿?
Pero lo cierto es que no suma los valores ix[i]
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve
Val: 2.239
Plata
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

No consigo arrancar con Python.

Publicado por xve (1646 intervenciones) el 15/11/2015 09:58:34
Hola Deo, no se muy bien que intentas conseguir, pero prueba este código:
1
2
3
4
5
6
7
8
9
import numpy
from numpy import *
x  = []
ix = random.rand(100)
 
for i in range(0,100):
	x.append(float(i+ix[i]))
 
print(x)

Coméntanos, ok?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

No consigo arrancar con Python.

Publicado por Alejandro (2 intervenciones) el 15/11/2015 16:56:44
Hola Deo, tal como dice el zen de python ("import this" para poder leerlo), explicito es mejor que implicito. Asi que bajo esa consigna, los int no se van a "convertir" en float automaticamente.

Basicamente, lo que debes hacer es a la hora de definir x, marcarlo como un array de floats

1
2
3
4
5
6
7
8
9
10
11
12
13
import numpy
 
from numpy import *
 
x  = arange(100.0)
 
ix = random.rand(100)
 
for i in range(0,100):
    # El primer indice de un array es 0!!
    x[i] = x[i] + ix[i]
 
print x

eso deberia darte este resultado, que seguramente es el que querias obtener:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[  0.29269147   1.62948254   2.21426421   3.55448003   4.53467146
   5.24487627   6.05315801   7.95859542   8.34498583   9.07693645
  10.33605712  11.21175201  12.05218509  13.08056695  14.59390374
  15.44149659  16.43762591  17.25957257  18.5682526   19.57153813
  20.27976624  21.12871537  22.64341142  23.59984894  24.09160886
  25.76591356  26.30825636  27.26792388  28.17877077  29.70775712
  30.73693327  31.48911455  32.01172336  33.57700945  34.86436942
  35.70340582  36.57327764  37.09799863  38.39746183  39.44137304
  40.36089365  41.64881136  42.94146343  43.00900172  44.10855095
  45.32959133  46.63315895  47.65949644  48.947777    49.69779693
  50.03638039  51.64191693  52.82725065  53.87419496  54.4228828
  55.42526572  56.45586953  57.43113724  58.31240569  59.20509368
  60.29027816  61.27189601  62.37577659  63.12927295  64.0778501
  65.44058556  66.39625502  67.77103593  68.4033195   69.25057878
  70.31637202  71.93642177  72.3527866   73.55117072  74.07395528
  75.63215682  76.86385914  77.19822864  78.19656734  79.55454464
  80.80198104  81.29813128  82.50130784  83.74919169  84.15703197
  85.58309068  86.58870977  87.01697382  88.19881608  89.04556757
  90.28997951  91.52172333  92.09683685  93.81859628  94.85245052
  95.87287894  96.39163217  97.63903781  98.66639908  99.16973741]


Espero que te haya iluminado... gracias, vuelva prontos...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

No consigo arrancar con Python.

Publicado por Deo (7 intervenciones) el 15/11/2015 18:14:00
Ok, Alejandro. Gracias.

Como puedes ver en mi anterior entrada, estaba llegando a esa conclusión.
Y, al hilo de ella, compruebo que, en efecto, sustituyendo en tu código el bucle for por:

x = x + ix

el funcionamiento es igualmente correcto.
Incluso lo es también con x = arange(100), pues en esta sentencia SI se redefine x como float[], cosa que no pasa en el bucle.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

No consigo arrancar con Python.

Publicado por deo (7 intervenciones) el 15/11/2015 17:47:12
Pues intentaba sumar a x los incrementos ix.
Pero la lié al reservar previamente cierto espacio con:

1
x  = arange(100)        # ERROR.  define x como int  

En vez de usar cosas como:

1
2
3
4
x  = arange(100.)            # OK al definir x como floats lo hubiese resuelto
 
for i in range(1,100):
    x[i] = x[i-i] + ix[i]          # si x[i] es int al sumarle ix[i]<1 redondea y conserva el valor: ERROR

Con float es correcto, como lo es la solución que propones, y que agradezco.
Pero ahora viene el verdadero reto: EVITAR el BUCLE.

Me explico:
1º) Como sabrás, operar con arrays como:
1
x = x + ix    # es mucho mas potente (mas Python, vaya..) que su alternativa..

2º) Con bucles:
1
2
for i in range(1,len(x)):
    x[i] = x[i] + ix[i]     # equivalente hasta aquí a lo anterior, pero en peor...

Mi problema es que necesito un desfase, -1: x[i] = x[i - 1] + ix[i] ,
y no sé como expresarlo en python... de forma directa.
Por eso recurrí al bucle, aunque con poco tino.
Pero, ahora que ya se como hacerlo con un bucle for, quisiera poder expresarlo correctamente.

Hasta donde sé (que aún no es mucho) se puede sumar elemento a elemento:
1
2
3
a = [1, 2, 3]
b = [4, 5, 6]
c = a + b          # debería dar [5, 7, 9], en vez de [1, 2, 3, 4, 5, 6], que es lo que me da !

Y algo similar me pasa cuando intento desfases como:
1
2
c =[1,   a[1:]+b[:-1] , 6]     # (análogo en bucle a: c[i] = a[i]+b[i-1] ) 
# pero resultando [1, [2, 3, 4, 5], 6], que difiere de lo que deseo:  [1,  6,8,  6] = [1,2,3,0]+[0,4,5,6]

Así pues, cualquier sugerencia al respecto será bien recibida.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

No consigo arrancar con Python.

Publicado por Alejandro (2 intervenciones) el 16/11/2015 00:30:44
Perdon Deo pero no logro comprender cual es tu duda...

Para lograr que C se a [5,7,9] sin la necesidad de un bucle sumar a y b no te va a dar el resultado querido ya que al sumar 2 arrays los estas concatenando, lo cual lleva, como vos dijiste, a [1,2,3,4,5,6]

a mi entender (que quizas este errado) vas a necesitar un bucle para sumar los items a menos que quieras hacer:

1
c = [ a[0] + b[0],a[1] + b[1],a[2] + b[2] ]

La solucion con un bucle seria:
1
2
3
c = []
for i in range(0, len(a)):
    c.append(a[i]+b[i])

La otra inquietud que estas teniendo, no comprendo de donde deberian salir los indices 1 y 2 del array ya que en a no hay 6 y en b no hay 8...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

No consigo arrancar con Python.

Publicado por deo (7 intervenciones) el 16/11/2015 20:07:15
Bueno, pues esta resuelto...
Así pues, diré cual era mi error...
y como me da que hay otros tan novatos como yo haré un pequeño resumen de la situación

ERRORES:
1º- Dar por echo que se reasignaría el tipo (int --> float) cuando en realidad no es lógico (no así, con [ ] dentro de un bucle.. )
2º- Confundir listas y arrays: aunque la lista tenga solo números.. lista se queda.

RESUMEN :

a = [0, 1, 2] # esto una lista: type(a) --> list
b = [4, 5, 6 ] # y esto es otra

import numpy
c = numpy.arange( 3 ) # pero esto es un array. type( c) --> numpy.ndarray

a + b # --> [0, 1, 2, 4, 5, 6]
c + b # --> [4, 6, 8] SUMA ELEMENTO a ELEMENTO de dos array o 'incluso' de array + lista !!!

Como verás, Alejandro, SI SE PUEDEN sumar. Este es mi Python!!!.
Lo que yo quería era sumar y desfasar a la vez a[0] + c[1], a[1] + c[2],......
Y TAMBIEN se puede. Ya encontré la forma. Basta usar los subíndices......

d = numpy.zeros( len(a) +1)
d [1:] = c[ :-1] + b[1: ] # suma desfasada -> d = [ 0, 1+4, 2+5, 0]
d [-1] = b[-1] # d = [ 0, 5, 7, 6]

PERO lo EXTRAORDINARIO es comparar el tiempo de ejecución de una de estas operaciones con su igual en bucle
(Dejo el texto preparado para meter en TRES celdas para que te sorprendas tu mismo !! -dos ordenes de magnitud- )

import numpy
m = numpy.arange( 1000 )
n = numpy.arange( 1000 )
s = numpy.arange( 1000 )

%%timeit # crono para bucle (meter todo en misma celda)
for i in range(1000):
s[ i ] = m[ i ] + n[ i ]

%%timeit # crono para misma operación vectorizada por numpy
s = m + n

El único problema ahora (y no se como resolverlo) es como vectorizar el siguiente bucle (no se si es posible tal cosa):

for i in range(1,1000):
s[ i ] = s[ i -1 ] + n[ i ] # notar que aquí cada valor s[ i ] contendrá sumas parciales acumuladas 0..i
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar