2010-08-31 65 views
0

條件的新數組假設我有一個數組定義爲:創建從numpy的陣列基於從列表

data = np.array([('a1v1', 'a2v1', 'a3v1', 'a4v1', 'a5v1'), 
     ('a1v1', 'a2v1', 'a3v1', 'a4v2', 'a5v1'), 
     ('a1v3', 'a2v1', 'a3v1', 'a4v1', 'a5v2'), 
     ('a1v2', 'a2v2', 'a3v1', 'a4v1', 'a5v2'), 
     ('a1v2', 'a2v3', 'a3v2', 'a4v1', 'a5v2'), 
     ('a1v2', 'a2v3', 'a3v2', 'a4v2', 'a5v1'), 
     ('a1v3', 'a2v3', 'a3v2', 'a4v2', 'a5v2'), 
     ('a1v1', 'a2v2', 'a3v1', 'a4v1', 'a5v1'), 
     ('a1v1', 'a2v3', 'a3v2', 'a4v1', 'a5v2'), 
     ('a1v2', 'a2v2', 'a3v2', 'a4v1', 'a5v2'), 
     ('a1v1', 'a2v2', 'a3v2', 'a4v2', 'a5v2'), 
     ('a1v3', 'a2v2', 'a3v1', 'a4v2', 'a5v2'), 
     ('a1v3', 'a2v1', 'a3v2', 'a4v1', 'a5v2'), 
     ('a1v2', 'a2v2', 'a3v1', 'a4v2', 'a5v1')], 
     dtype=[('a1', '|S4'), ('a2', '|S4'), ('a3', '|S4'), 
      ('a4', '|S4'), ('a5', '|S4')]) 

如何創建一個功能列出了由行數據元素在給定的條件下元組列表,r。

r = [('a1', 'a1v1'), ('a4', 'a4v1')] 

我知道,它可以手動完成這樣的:

data[(data['a1']=='a1v1') & data['a4']=='a4v1'] 

怎麼樣從使用R符合數據刪除行。

data[(data['a1']!='a1v1') | data['a4']!='a4v1'] 

謝謝。

回答

1

如果我正確地理解了你,你想列出整個行,列的給定元組等於某個值。在這種情況下,這應該是你想要的,雖然這是一個有點冗長,晦澀:

test_cols = data[['a1', 'a4']] 
test_vals = np.array(('a1v1', 'a4v1'), test_cols.dtype) 
data[test_cols == test_vals] 

注意「嵌套表」風格索引......這是選擇一個結構化的陣列的多個列的最簡單的方法。例如。

data[['a1', 'a4']] 

將產生

array([('a1v1', 'a4v1'), ('a1v1', 'a4v2'), ('a1v3', 'a4v1'), 
     ('a1v2', 'a4v1'), ('a1v2', 'a4v1'), ('a1v2', 'a4v2'), 
     ('a1v3', 'a4v2'), ('a1v1', 'a4v1'), ('a1v1', 'a4v1'), 
     ('a1v2', 'a4v1'), ('a1v1', 'a4v2'), ('a1v3', 'a4v2'), 
     ('a1v3', 'a4v1'), ('a1v2', 'a4v2')], 
     dtype=[('a1', '|S4'), ('a4', '|S4')]) 

然後,您可以測試這個agains,你檢查的值的元組,並得到一個一維數組布爾其中那些列等於這些值。

但是,對於結構化數組,dtype必須完全匹配。例如。 data[['a1', 'a4']] == ('a1v1', 'a4v1')只產生False,所以我們必須使用與我們測試的列相同的dtype來測試我們想要測試的值的數組。因此,我們必須做一些事情,如:

test_cols = data[['a1', 'a4']] 
test_vals = np.array(('a1v1', 'a4v1'), test_cols.dtype) 

我們可以做到這一點之前:

data[test_cols == test_vals] 

其中產量我們最初後:

array([('a1v1', 'a2v1', 'a3v1', 'a4v1', 'a5v1'), 
     ('a1v1', 'a2v2', 'a3v1', 'a4v1', 'a5v1'), 
     ('a1v1', 'a2v3', 'a3v2', 'a4v1', 'a5v2')], 
     dtype=[('a1', '|S4'), ('a2', '|S4'), ('a3', '|S4'), ('a4', '|S4'), ('a5', '|S4')]) 

希望這有一定道理,無論如何...

+0

謝謝喬金頓。 – riza 2010-08-31 17:18:35

+0

如果r不符合數據dtype的順序? 例如,r = [('a4','a4v1'),('a1','a1v1')]。 – riza 2010-08-31 22:32:20

+0

是的,這是該方法的一個難點。列必須以與dtype相同的順序列出。 (或者,相反,它們將按照dtype的順序返回,而不管它們的列出順序如何)。我認爲這只是結構化數組的設計限制。郵件列表,(http://www.mail-archive.com/[email protected]/msg24453.html),但它顯然從來沒有成爲numpy的主幹版本...... – 2010-09-01 15:07:42