Подтвердить что ты не робот

Добавление поля в структурированный массив numpy

Каков самый чистый способ добавить поле в структурированный массив numpy? Можно ли это сделать разрушительно или необходимо создать новый массив и скопировать поверх существующих полей? Сохраняется ли содержимое каждого поля в памяти в памяти так, что такое копирование может быть выполнено эффективно?

4b9b3361

Ответ 1

Если вы используете numpy 1.3, там также numpy.lib.recfunctions.append_fields().

Для многих установок вам потребуется import numpy.lib.recfunctions, чтобы получить доступ к этому. import numpy не позволит увидеть numpy.lib.recfunctions

Ответ 2

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