2009-07-29 12 views
20

構造化numpy配列にフィールドを追加する最もクリーンな方法は何ですか?破壊的に行うことができますか、または新しい配列を作成して既存のフィールドにコピーする必要がありますか?このようなコピーを効率的に行うために、各フィールドの内容は連続してメモリに格納されていますか?構造化numpy配列へのフィールドの追加

答えて

19

numpy 1.3を使用している場合は、numpy.lib.recfunctions.append_fields()もあります。

多くのインストールでは、これにアクセスするにはimport numpy.lib.recfunctionsが必要です。 import numpyは誰にも表示されないようにしますnumpy.lib.recfunctions

6
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 
+1

これはメモリの重複を避けるために修正できますか? ([この質問](http://stackoverflow.com/q/39965994/974555)を参照してください) – gerrit

関連する問題