[英]How to remove a column from a structured numpy array *without copying it*?
[英]How do you remove a column from a structured numpy array?
假設您有一個結構化的 numpy 數組,它是從 csv 生成的,第一行作為字段名稱。 該數組具有以下形式:
dtype([('A', '<f8'), ('B', '<f8'), ('C', '<f8'), ..., ('n','<f8'])
現在,假設您要從此數組中刪除 'ith' 列。 有沒有方便的方法來做到這一點?
我希望它像刪除一樣工作:
new_array = np.delete(old_array, 'i')
有任何想法嗎?
這不是一個單一的函數調用,但以下顯示了刪除第 i 個字段的一種方法:
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 的mlab
模塊的drop_rec_fields
函數。
更新:請參閱我在如何從結構化的 numpy 數組中刪除列 * 而不復制它* 的答案? 用於創建結構化數組字段子集視圖而不復制數組的方法。
在這里搜索了我的方式並從 Warren 的回答中了解了我需要知道的內容后,我忍不住發布了一個更簡潔的版本,並添加了一次有效刪除多個字段的選項:
def rmfield( a, *fieldnames_to_remove ):
return a[ [ name for name in a.dtype.names if name not in fieldnames_to_remove ] ]
例子:
a = rmfield(a, 'foo')
a = rmfield(a, 'foo', 'bar') # remove multiple fields at once
或者,如果我們真的要打高爾夫球,下面是等價的:
rmfield=lambda a,*f:a[[n for n in a.dtype.names if n not in f]]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.