Numpy: Enh : fonction de création de tableau d'objets

Créé le 2 juin 2015  ·  4Commentaires  ·  Source: numpy/numpy

Comme indiqué dans le numéro 5303, il n'est actuellement pas possible de créer des tableaux de type d'objet contenant des séquences de longueur égale, car la séquence est automatiquement lue en tant qu'éléments de tableau. Il est suggéré de ne le faire que pour les listes, mais cela constituerait une rupture majeure de compatibilité descendante et nécessiterait une longue période d'obsolescence.

Une autre approche serait d'avoir une fonction explicitement pour créer des tableaux avec un type d'objet. Cela pourrait peut-être s'appeler "objectarray". La valeur par défaut pour cette fonction serait de prendre une séquence et de considérer chaque élément de la séquence comme un élément dans un tableau d'objets 1D.

La fonction, cependant, pourrait avoir un argument optionnel "ndim" ou "depth", qui pourrait être utilisé pour spécifier combien de niveaux de la séquence doivent être considérés comme faisant partie du tableau. Ce serait 0 par défaut (seul le niveau le plus externe est pris en compte). Cela déclencherait une exception si les dimensions ne correspondent pas.

Notez que cette approche n'est pas mutuellement exclusive avec l'alternative, mais a l'avantage de ne pas rompre la rétrocompatibilité.

Ainsi par exemple :

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

Commentaire le plus utile

J'espère que je ne manque rien, mais il me semble qu'un argument ndmax résoudrait non seulement le problème signalé ("_créer des tableaux d'objet dtype contenant des séquences de longueur égale_"), mais apporterait également des gains de performances dans les cas dans lesquels, par exemple, le dernier objet de l'entrée n'est pas une liste (ou est une liste de longueur différente). Voir aussi cette question .

Tous les 4 commentaires

Je pense que le moyen le plus simple d'obtenir des listes de taille égale dans un tableau d'objets consiste en deux étapes :

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

Probablement une implémentation de objectarray fonctionnerait comme ça.

Oui, c'est actuellement la meilleure façon, mais c'est inutilement verbeux. D'où cette idée.

J'espère qu'une implémentation de cette idée serait simplement capable de contourner la conversion automatique utilisée dans la fonction array et de substituer la sienne au constructeur ndarray .

J'espère que je ne manque rien, mais il me semble qu'un argument ndmax résoudrait non seulement le problème signalé ("_créer des tableaux d'objet dtype contenant des séquences de longueur égale_"), mais apporterait également des gains de performances dans les cas dans lesquels, par exemple, le dernier objet de l'entrée n'est pas une liste (ou est une liste de longueur différente). Voir aussi cette question .

Des progrès ou sur ou des plans pour mettre en œuvre ndmax ? Ce que je fais en ce moment :

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

# This would look a lot cleaner:
np.array(data, ndmax=1)
Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

astrofrog picture astrofrog  ·  4Commentaires

keithbriggs picture keithbriggs  ·  3Commentaires

manuels picture manuels  ·  3Commentaires

qualiaa picture qualiaa  ·  3Commentaires

navytux picture navytux  ·  4Commentaires