python - tutorial - Creación eficiente de matrices numpy desde la comprensión de lista y en general
numpy tutorial español pdf (2)
En mi trabajo actual, uso Numpy y enumero las comprensiones y, en aras del mejor rendimiento posible, tengo las siguientes preguntas:
¿Qué sucede realmente detrás de escena si creo una matriz Numpy de la siguiente manera? :
a = numpy.array( [1,2,3,4] )
Mi conjetura es que Python primero crea una lista ordinaria que contiene los valores, luego usa el tamaño de la lista para asignar una matriz numpy y luego copia los valores en esta nueva matriz. ¿Es correcto o el intérprete es lo suficientemente inteligente como para darse cuenta de que la lista es solo intermedia y en su lugar, copiar los valores directamente?
De manera similar, si deseo crear una matriz numpy desde la comprensión de la lista usando numpy.fromiter ():
a = numpy.fromiter( [ x for x in xrange(0,4) ], int )
¿resultará esto en una lista intermedia de valores que se crean antes de ser introducidos en fromiter ()?
Saludos cordiales Niels
Creo que la respuesta que estás buscando es usar generator expressions
con numpy.fromiter .
numpy.fromiter((<some_func>(x) for x in <something>),<dtype>,<size of something>)
Las expresiones del generador son perezosas: evalúan la expresión cuando las iteras.
El uso de la lista de comprensión hace que la lista, luego la alimente en números, mientras que las expresiones del generador producirán una a la vez.
Python evalúa las cosas por dentro -> fuera, como la mayoría de los lenguajes (si no todos), por lo que usar [<something> for <something_else> in <something_different>]
haría la lista, luego iterarla.
Puedes crear tu propia lista y experimentar con ella para arrojar algo de luz sobre la situación ...
>>> class my_list(list):
... def __init__(self, arg):
... print ''spam''
... super(my_list, self).__init__(arg)
... def __len__(self):
... print ''eggs''
... return super(my_list, self).__len__()
...
>>> x = my_list([0,1,2,3])
spam
>>> len(x)
eggs
4
>>> import numpy as np
>>> np.array(x)
eggs
eggs
eggs
eggs
array([0, 1, 2, 3])
>>> np.fromiter(x, int)
array([0, 1, 2, 3])
>>> np.array(my_list([0,1,2,3]))
spam
eggs
eggs
eggs
eggs
array([0, 1, 2, 3])