Numpy: Enh: función de creación de matriz de objetos

Creado en 2 jun. 2015  ·  4Comentarios  ·  Fuente: numpy/numpy

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)

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 .

Todos 4 comentarios

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)
¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

Kreol64 picture Kreol64  ·  3Comentarios

dcsaba89 picture dcsaba89  ·  3Comentarios

kevinzhai80 picture kevinzhai80  ·  4Comentarios

inducer picture inducer  ·  3Comentarios

qualiaa picture qualiaa  ·  3Comentarios