Como se discutió en el problema #5303, actualmente no es posible crear matrices de tipo de objeto que contengan secuencias de igual longitud, ya que la secuencia se lee automáticamente como elementos de la matriz. Hay una sugerencia de hacer esto solo para las listas, pero esto sería una interrupción importante de la compatibilidad con versiones anteriores y requeriría un largo período de obsolescencia.
Otro enfoque sería tener una función explícita para crear matrices con un tipo de objeto. Quizás esto podría llamarse "matriz de objetos". El valor predeterminado para esta función sería tomar una secuencia y considerar cada elemento de la secuencia como un elemento en una matriz de objetos 1D.
Sin embargo, la función podría tener un argumento "ndim" o "profundidad" opcional, que podría usarse para especificar cuántos niveles de la secuencia deben considerarse parte de la matriz. El valor predeterminado es 0 (solo se considera el nivel más externo). Esto generaría una excepción si las dimensiones no coinciden.
Tenga en cuenta que este enfoque no se excluye mutuamente con la alternativa, pero tiene la ventaja de que no rompería la compatibilidad con versiones anteriores.
Así por ejemplo:
>>> arr = objectarray([((1, 2, 3), (4, 5, 6)), ((7, 8, 9), (10, 11, 12))])
>>> arr
array([((1, 2, 3), (4, 5, 6)), ((7, 8, 9), (10, 11, 12))], dtype=object)
>>> arr.shape
(2,)
>>> arr = objectarray([((1, 2, 3), (4, 5, 6)), ((7, 8, 9), (10, 11, 12))], depth=1)
>>> arr
array([[(1, 2, 3), (4, 5, 6)],
[(7, 8, 9), (10, 11, 12)]], dtype=object)
>>> arr.shape
(2, 2)
>>> arr = objectarray([((1, 2, 3), (4, 5, 6)), ((7, 8, 9), (10, 11, 12))], depth=2)
>>> arr
array([[[1, 2, 3],
[4, 5, 6]],
[[7, 8, 9],
[10, 11, 12]]], dtype=object)
>>> arr.shape
(2, 2, 3)
Creo que la forma más fácil de obtener listas de igual tamaño en una matriz de objetos es en dos pasos:
>>> a = empty((2,), dtype=np.object)
>>> a[:] = [[1,2,3],[4,5,6]]
>>> b = empty((2,3), dtype=np.object)
>>> b[:] = [[1,2,3],[4,5,6]]
Probablemente una implementación de objectarray
funcionaría así.
Sí, esa es actualmente la mejor manera, pero es innecesariamente detallada. De ahí esta idea.
Espero que una implementación de esta idea simplemente pueda omitir la conversión automática utilizada en la función array
y sustituirla por el constructor ndarray
.
Espero no estar perdiéndome nada, pero me parece que un argumento ndmax
no solo resolvería el problema informado ("_crea matrices de objetos dtype que contienen secuencias de igual longitud_"), sino que también aportaría mejoras de rendimiento en aquellos casos en los que, por ejemplo, el último objeto de la entrada no es una lista (o es una lista con diferente longitud). También vea esta pregunta .
¿Algún progreso o planes para implementar ndmax
? Lo que estoy haciendo ahora mismo:
np.array([*data, None])[:-1]
# This would look a lot cleaner:
np.array(data, ndmax=1)
Comentario más útil
Espero no estar perdiéndome nada, pero me parece que un argumento
ndmax
no solo resolvería el problema informado ("_crea matrices de objetos dtype que contienen secuencias de igual longitud_"), sino que también aportaría mejoras de rendimiento en aquellos casos en los que, por ejemplo, el último objeto de la entrada no es una lista (o es una lista con diferente longitud). También vea esta pregunta .