最初の行がフィールド名である csv から生成された、構造化された numpy 配列があるとします。配列の形式は次のとおりです。
dtype([('A', '<f8'), ('B', '<f8'), ('C', '<f8'), ..., ('n','<f8'])
ここで、この配列から「ith」列を削除するとします。それを行う便利な方法はありますか?
削除のように機能させたい:
new_array = np.delete(old_array, 'i')
何か案は?
これは単一の関数呼び出しではありませんが、次の例は 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配列から列を*コピーせずに*削除する方法で私の答えを参照してください? 配列のコピーを作成せずに、構造化配列のフィールドのサブセットのビューを作成するメソッド。