Aggiunta di un campo a una matrice numpy strutturata
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?
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