8
votes

Aucun opérateur binaire pour les tableaux structurés dans NUMPY?

D'accord, alors après avoir traversé les tutoriels sur les tableaux structurés de Numpy, je suis capable de créer des exemples simples: xxx

(mon cas d'utilisation prévu aurait plus de trois entrées et utiliserait très Long 1d-tableaux.) Donc, tout va bien jusqu'à ce que nous essayions d'effectuer des mathématiques de base. Je reçois des erreurs pour toutes les opérations suivantes: xxx

apparemment, des opérateurs simples (+, -, * /) ne sont pas pris en charge pour même les réseaux structurés les plus simples. Ou je manque quelque chose? Devrais-je regarder un autre paquet (et ne dis pas de pandas, car il s'agit d'une excédence totale pour cela)? Cela semble être une capacité évidente, alors je suis un peu abasourdi. Mais il est difficile de trouver un bavardage à ce sujet sur le net. Cela ne limite-t-il pas gravement l'utilité des tableaux structurés? Pourquoi quelqu'un utilisera-t-il une matrice de structure plutôt que des tableaux emballés dans un dict? Y a-t-il une raison technique pour laquelle cela pourrait être intraitable? Ou, si la solution correcte consiste à effectuer le travail ardu de surcharge, comment est-ce fait tout en conservant les opérations rapidement?


0 commentaires

3 Réponses :


4
votes

sur les pages NUMPLIQUES NUMPLY CODE> NUMPY CODE> STRUCTUREUX, la plupart des exemples impliquent des types de données mixtes - des flotteurs, des INT et des chaînes. Donc, la plupart des questions structurées de la matrice ont à faire avec chargement de données mixtes à partir de fichiers CSV. D'autre part, dans votre exemple, il apparaît que l'objectif principal de la structure est de donner des noms aux "colonnes".

Vous pouvez faire des mathématiques sur les colonnes nommées, par exemple P>

class Foo(object):
    def __init__(self):
        self.scalar = 1
        self._1d_array = np.arange(10)
        self._2d_array = np.array([[1,2],[3,4]])


1 commentaires

J'apprécie votre réponse. Cela va un long chemin à expliquer la situation. Au cœur de la situation, il semble que les développeurs numpus avaient un cas d'utilisation à l'esprit pour des matrices structurées et que mon cas d'utilisation n'est pas compatible. C'est la vie.



0
votes

D'accord, après plus de recherches, j'ai trébuché sur une réponse. (Pas de faute à HPaulj - la question n'a pas été posée tout cela bien.) Mais je voulais poster au cas où quelqu'un d'autre ait une frustration similaire.

La réponse provient de la documentation numpy sur Ndarray.View. Ils fournissent spécifiquement un exemple dans lequel ils "[Créer] une vue sur un tableau structuré de sorte qu'il peut être utilisé dans des calculs".

Donc, j'étais frustré que je ne pouvais pas utiliser mes testables structurées par exemple . Après tout, je "vois" mon tableau structuré comme simplement une collection de nombres de points flottants! Eh bien, à la fin, tout ce dont j'avais besoin consistait à informer Numpy de cette abstraction en utilisant "View". Les erreurs de la question peuvent être évitées à l'aide de: xxx

Ceci n'est pas aussi élégant que possible, mais au moins numpy a la capacité.


3 commentaires

Il peut être possible de construire cette vision alternative dans le DTYPE d'origine. Regardez des exemples le régalez les données à la fois en tant qu'OB et ensembles d'octets. Je vais essayer l'idée quand je retourne à l'ordinateur avec un nombre engourdi.


Si vous souhaitez conserver la forme de votre tableau, utilisez quelque chose comme Struct_array1.View ('(8,) F8') , où le (8,) est le numéro de flotteurs dans votre DTYPE, structure_array1.dtype.itemse.itemise / 8 .


J'ai ajouté une réponse à l'aide de champs qui se chevauchent comme une alternative (compatible) à la vue .



3
votes

Une autre façon d'opérer sur l'ensemble de la matrice consiste à utiliser le DTYPE «Union» décrit dans la documentation. Dans votre exemple, vous pouvez élargir votre DTYPE en ajoutant un champ "Union" et en spécifiant des "décalages" "pre> xxx pré>

['Union'] code> donne maintenant accès à toutes les données sous forme de (n, 8) code> tableau p> xxx pré>

Vous pouvez utiliser "Union" ou tout autre champ: P>

array([ (3.0, [0.0, 0.0, 0.0], [[2.0, 2.0], [0.0, 0.0]], 
      [[3.0, 0.0, 0.0, 0.0], [2.0, 2.0, 0.0, 0.0]])], 
      dtype={'names':['scalar','1d-array','2d-array','union'], 
             'formats':['<f8',('<f8', (3,)),('<f8', (2, 2)),('<f8', (2, 4))], 
             'offsets':[0,8,32,0], 
             'itemsize':64})


0 commentaires