una tutorial transpuesta multiplicar matriz matrices libreria español elementos ejemplos crear con array agregar python performance numpy

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])