2009-07-29 7 views
20

Quel est le moyen le plus propre d'ajouter un champ à un tableau numpy structuré? Peut-il être fait de manière destructive, ou est-il nécessaire de créer un nouveau tableau et de copier sur les champs existants? Le contenu de chaque champ est-il stocké de manière contiguë dans la mémoire afin que cette copie puisse être effectuée efficacement?Ajout d'un champ à un tableau numpy structuré

Répondre

19

Si vous utilisez numpy 1.3, il existe également numpy.lib.recfunctions.append_fields().

Pour de nombreuses installations, vous aurez besoin de import numpy.lib.recfunctions pour y accéder. import numpy ne permettra pas de voir le numpy.lib.recfunctions

6
import numpy 

def add_field(a, descr): 
    """Return a new array that is like "a", but has additional fields. 

    Arguments: 
     a  -- a structured numpy array 
     descr -- a numpy type description of the new fields 

    The contents of "a" are copied over to the appropriate fields in 
    the new array, whereas the new fields are uninitialized. The 
    arguments are not modified. 

    >>> sa = numpy.array([(1, 'Foo'), (2, 'Bar')], \ 
         dtype=[('id', int), ('name', 'S3')]) 
    >>> sa.dtype.descr == numpy.dtype([('id', int), ('name', 'S3')]) 
    True 
    >>> sb = add_field(sa, [('score', float)]) 
    >>> sb.dtype.descr == numpy.dtype([('id', int), ('name', 'S3'), \ 
             ('score', float)]) 
    True 
    >>> numpy.all(sa['id'] == sb['id']) 
    True 
    >>> numpy.all(sa['name'] == sb['name']) 
    True 
    """ 
    if a.dtype.fields is None: 
     raise ValueError, "`A' must be a structured numpy array" 
    b = numpy.empty(a.shape, dtype=a.dtype.descr + descr) 
    for name in a.dtype.names: 
     b[name] = a[name] 
    return b 
+1

Peut-il être modifié pour éviter la duplication de la mémoire? (Voir [cette question] (http://stackoverflow.com/q/39965994/974555)) – gerrit

Questions connexes