Question

Quel est le moyen le plus propre d’ajouter un champ à un tableau numpy structuré? Peut-on le faire de manière destructive ou faut-il créer un nouveau tableau et copier sur les champs existants? Le contenu de chaque champ est-il stocké de manière contiguë en mémoire afin de permettre une telle copie?

Était-ce utile?

La solution

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

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

Autres conseils

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top