2013-03-22 84 views
11

我還有一個基本問題,我一直無法找到答案,但看起來應該很容易做到。如何從結構化numpy數組中刪除列?

好吧,想象你有一個結構化的numpy數組,從csv生成,第一行爲字段名稱。該陣列的形式:

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

現在,讓我們說你想從這個數組中刪除'ith'列。有沒有一種方便的方法來做到這一點?

我想要它像刪除工作:

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

任何想法?

+0

都是dtypes f8嗎? – 2013-03-22 18:41:39

回答

13

這不是很一個函數調用,但下面顯示下降的第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 

此外,CH找出drop_rec_fields function,它是matplotlib的mlab module的一部分。


更新:見我的答案在How to remove a column from a structured numpy array *without copying it*?用於創建一個結構數組的字段的子集的視圖,而不該數組的副本的方法。

+0

+1 3分鐘之內擊敗我! – Jaime 2013-03-22 18:42:08

+1

@Jaime:勉強。 :)既然你刪除了你的答案,我會提到刪除字段名稱而不是數字,這可能更自然。 – 2013-03-22 18:48:21

5

已經GOOGLE了這裏的路上,得知我需要從沃倫的回答知道,我無法抗拒張貼了更爲簡潔的版本,添加的選項刪除有效地一氣呵成多個字段:

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]] 
+0

如果我可以這樣說,你的第二個解決方案是相當難看的。特別是我不喜歡使用lambda表達式來實現函數聲明。這不是一個好的風格,很難閱讀。其他人似乎同意我的觀點:http://stackoverflow.com/a/134638/1375015 – 2016-05-06 18:12:55

+1

也許你沒有閱讀過「如果我們真的打算打高爾夫球」這句話......「code golf 「是創建最短的代碼,而不考慮可讀性,並且幾乎永遠不會變得醜陋。 – jez 2016-05-06 18:48:27

+0

我不知道那句話。我仍然沒有看到這一點,但在這種情況下,我的迴應可能有點苛刻。 – 2016-05-06 18:57:10

相關問題