Numpy: Enh: Função de criação de array de objetos

Criado em 2 jun. 2015  ·  4Comentários  ·  Fonte: numpy/numpy

Conforme discutido na edição #5303, atualmente não é possível criar arrays de object dtype contendo sequências de igual comprimento, pois a sequência é lida automaticamente como elementos de array. Há uma sugestão de fazer isso apenas para listas, mas isso seria uma grande quebra de compatibilidade com versões anteriores e exigiria um longo período de descontinuação.

Outra abordagem seria ter uma função explicitamente para criar arrays com um objeto dtype. Talvez isso possa ser chamado de "objectarray". O padrão para esta função seria receber uma sequência e considerar cada elemento da sequência como um elemento em uma matriz de objetos 1D.

A função, no entanto, pode ter um argumento opcional "ndim" ou "profundidade", que pode ser usado para especificar quantos níveis da sequência devem ser considerados parte da matriz. O padrão seria 0 (somente o nível mais externo é considerado). Isso geraria uma exceção se as dimensões não corresponderem.

Observe que essa abordagem não é mutuamente exclusiva com a alternativa, mas tem a vantagem de não quebrar a compatibilidade com versões anteriores.

Assim, por exemplo:

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

Comentários muito úteis

Espero não estar faltando nada, mas me parece que um argumento ndmax não só resolveria o problema relatado ("_criar arrays de objeto dtype contendo sequências de tamanho igual_"), mas também trazer ganhos de desempenho em aqueles casos em que, por exemplo, o último objeto na entrada não é uma lista (ou é uma lista com comprimento diferente). Veja também esta pergunta .

Todos 4 comentários

Acho que a maneira mais fácil de obter listas de tamanhos iguais em uma matriz de objetos é em duas etapas:

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

Provavelmente uma implementação de objectarray funcionaria assim.

Sim, essa é atualmente a melhor maneira, mas é desnecessariamente detalhada. Daí esta ideia.

Eu esperaria que uma implementação dessa ideia fosse simplesmente capaz de ignorar a conversão automática usada na função array e substituir sua própria para o construtor ndarray .

Espero não estar faltando nada, mas me parece que um argumento ndmax não só resolveria o problema relatado ("_criar arrays de objeto dtype contendo sequências de tamanho igual_"), mas também trazer ganhos de desempenho em aqueles casos em que, por exemplo, o último objeto na entrada não é uma lista (ou é uma lista com comprimento diferente). Veja também esta pergunta .

Algum progresso ou planos para implementar ndmax ? O que estou fazendo agora:

np.array([*data, None])[:-1]

# This would look a lot cleaner:
np.array(data, ndmax=1)
Esta página foi útil?
0 / 5 - 0 avaliações