Domanda

Qual è il modo più pulito per aggiungere un campo a un array numpy strutturato? Può essere fatto in modo distruttivo o è necessario creare un nuovo array e copiarlo sui campi esistenti? I contenuti di ciascun campo vengono archiviati in modo contiguo nella memoria in modo tale che tale copia possa essere eseguita in modo efficiente?

È stato utile?

Soluzione

Se stai usando numpy 1.3, c'è anche numpy.lib.recfunctions.append_fields ().

Per molte installazioni, è necessario importare numpy.lib.recfunctions per accedere a questo. import numpy non consente di vedere numpy.lib.recfunctions

Altri suggerimenti

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top