22

将字段添加到结构化 numpy 数组的最简洁方法是什么?它可以破坏性地完成,还是有必要创建一个新数组并复制现有字段?每个字段的内容是否连续存储在内存中,以便可以有效地完成此类复制?

4

2 回答 2

20

如果您使用的是 numpy 1.3,还有 numpy.lib.recfunctions.append_fields()。

对于许多安装,您需要import numpy.lib.recfunctions访问它。import numpy不允许任何人看到numpy.lib.recfunctions

于 2009-07-30T17:18:58.540 回答
8
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
于 2009-07-29T17:25:29.880 回答