Conciliar np.fromiter y matrices multidimensionales en Python

Me encanta usar np.fromiter from numpy porque es una forma perezosa de recursos para construir objetos np.array . Sin embargo, parece que no admite matrices multidimensionales, que también son bastante útiles.

 import numpy as np def fun(i): """ A function returning 4 values of the same type. """ return tuple(4*i + j for j in range(4)) # Trying to create a 2-dimensional array from it: a = np.fromiter((fun(i) for i in range(5)), '4i', 5) # fails # This function only seems to work for 1D array, trying then: a = np.fromiter((fun(i) for i in range(5)), [('', 'i'), ('', 'i'), ('', 'i'), ('', 'i')], 5) # painful # .. `a` now looks like a 2D array but it is not: a.transpose() # doesn't work as expected a[0, 1] # too many indices (of course) a[:, 1] # don't even think about it 

¿Cómo puedo obtener a matriz multidimensional para mantener una construcción tan perezosa basada en generadores?

Por sí mismo, np.fromiter solo admite la construcción de matrices 1D y, como tal, espera una iterable que produzca valores individuales en lugar de tuplas / listas / secuencias, etc. Una forma de evitar esta limitación sería utilizar itertools.chain.from_iterable para ‘desempaquetar’ la salida de la expresión de su generador en una sola secuencia de valores 1D:

 import numpy as np from itertools import chain def fun(i): return tuple(4*i + j for j in range(4)) a = np.fromiter(chain.from_iterable(fun(i) for i in range(5)), 'i', 5 * 4) a.shape = 5, 4 print(repr(a)) # array([[ 0, 1, 2, 3], # [ 4, 5, 6, 7], # [ 8, 9, 10, 11], # [12, 13, 14, 15], # [16, 17, 18, 19]], dtype=int32)