17

最初の行がフィールド名である csv から生成された、構造化された numpy 配列があるとします。配列の形式は次のとおりです。

dtype([('A', '<f8'), ('B', '<f8'), ('C', '<f8'), ..., ('n','<f8'])

ここで、この配列から「ith」列を削除するとします。それを行う便利な方法はありますか?

削除のように機能させたい:

new_array = np.delete(old_array, 'i')

何か案は?

4

2 に答える 2

21

これは単一の関数呼び出しではありませんが、次の例は i 番目のフィールドを削除する 1 つの方法を示しています。

In [67]: a
Out[67]: 
array([(1.0, 2.0, 3.0), (4.0, 5.0, 6.0)], 
      dtype=[('A', '<f8'), ('B', '<f8'), ('C', '<f8')])

In [68]: i = 1   # Drop the 'B' field

In [69]: names = list(a.dtype.names)

In [70]: names
Out[70]: ['A', 'B', 'C']

In [71]: new_names = names[:i] + names[i+1:]

In [72]: new_names
Out[72]: ['A', 'C']

In [73]: b = a[new_names]

In [74]: b
Out[74]: 
array([(1.0, 3.0), (4.0, 6.0)], 
      dtype=[('A', '<f8'), ('C', '<f8')])

関数としてまとめると:

def remove_field_num(a, i):
    names = list(a.dtype.names)
    new_names = names[:i] + names[i+1:]
    b = a[new_names]
    return b

特定のフィールド名を削除する方が自然かもしれません:

def remove_field_name(a, name):
    names = list(a.dtype.names)
    if name in names:
        names.remove(name)
    b = a[names]
    return b

また、matplotlibのモジュールの一部であるdrop_rec_fields関数も確認してください。mlab


更新:構造化されたnumpy配列から列を*コピーせずに*削除する方法で私の答えを参照してください? 配列のコピーを作成せずに、構造化配列のフィールドのサブセットのビューを作成するメソッド。

于 2013-03-22T18:37:45.190 に答える