Добавление поля в структурированный массив NumPy
Какой самый чистый способ добавить поле в структурированный массив NumPy? Это может быть сделано деструктивно, или необходимо создать новый массив и скопировать существующие поля? Содержится ли содержимое каждого поля непрерывно в памяти, чтобы такое копирование могло быть выполнено эффективно?
2 ответа
Решение
Если вы используете numpy 1.3, есть также numpy.lib.recfunctions.append_fields().
Для многих установок вам понадобится import numpy.lib.recfunctions
чтобы получить доступ к этому. import numpy
не позволит увидеть numpy.lib.recfunctions
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