2010-02-28 4 views
20

Je crée un tableau numérique qui doit être rempli avec les objets d'une classe particulière que j'ai créée. Je voudrais initialiser le tableau de sorte qu'il ne contienne jamais que des objets de cette classe. Par exemple, voici ce que j'aimerais faire et ce qui se passe si je le fais.Types de données personnalisés dans des tableaux numpy

class Kernel: 
    pass 

>>> L = np.empty(4,dtype=Kernel) 

TypeError: data type not understood 

Je peux le faire:

>>> L = np.empty(4,dtype=object) 

et ensuite affecter chacun des éléments de L comme un objet Kernel (ou tout autre type d'objet). Ce serait tellement net que je pourrais avoir un tableau de Kernel s, cependant, d'un point de vue de la programmation (vérification de type) et mathématique (opérations sur des ensembles de fonctions).

Y a-t-il un moyen pour moi de spécifier le type de données d'un tableau numpy en utilisant une classe arbitraire?

Répondre

18

Si votre classe de noyau dispose d'une quantité prévisible de données de membre, vous pouvez définir un type dtype à la place d'une classe. par exemple. si elle est paramétrés par 9 flotteurs et un int, vous pouvez faire

kerneldt = np.dtype([('myintname', np.int32), ('myfloats', np.float64, 9)]) 
arr = np.empty(dims, dtype=kerneldt) 

Vous aurez à faire une contrainte pour les transformer en objets de la classe noyau chaque fois que vous voulez manipuler les méthodes d'un seul noyau, mais c'est un façon de stocker les données réelles dans un tableau NumPy. Si vous voulez seulement stocker une référence, alors l'objet dtype est ce que vous pouvez faire de mieux sans sous-classer ndarray.

+0

C'est ce que je cherchais! Bien que je commence à penser que c'est beaucoup plus de travail que cela vaut la peine ... Lira sur np.dtype. –

1

Pour autant que je sache, l'application d'un seul type d'éléments un numpy.ndarray doit être fait manuellement (sauf si le tableau contient des scalaires Numpy): il n'y a pas de mécanisme de vérification intégré (votre tableau a dtype = object). Si vous voulez vraiment appliquer un seul type, vous devez sous-classer ndarray et implémenter les contrôles dans les méthodes appropriées (__setitem__, etc.).

Si vous souhaitez implémenter des opérations sur un ensemble de fonctions (objets du noyau), vous pouvez le faire en définissant les opérations appropriées directement dans votre classe de noyau. C'est ce que j'ai fait pour mon module uncertainties.py, qui gère numpy.ndarrays de nombres avec des incertitudes.