2014-03-26 42 views
1

我有一個大的二維numpy數組a(dtype ='a1'),並且希望找到包含相同字符的不變列。以下代碼有效,但速度很慢。檢查numpy數組中的不變列

var_col = np.zeros(a.shape[1], dtype='bool') 
for c in xrange(a.shape[1]): 
    if not all(a[:,c] == a[0,c]): 
     var_col[c] = True 

有沒有更快的解決方案來解決這個問題? 謝謝!

回答

2

以下是一種使用==運營商的廣播方法。

首先創建一個測試數組。

In [27]: np.random.seed(1) 

In [28]: a = np.random.choice(list("AABC"), size=(3,9)) 

In [29]: a 
Out[29]: 
array([['A', 'C', 'A', 'A', 'C', 'A', 'C', 'A', 'C'], 
     ['A', 'A', 'A', 'A', 'C', 'A', 'A', 'B', 'A'], 
     ['B', 'A', 'B', 'A', 'B', 'A', 'C', 'A', 'B']], 
     dtype='|S1') 

將每個元素與其列頂部的元素進行比較。第一排是a[0];它是一個1d數組(形狀是(9,))。當我們使用==這樣的兩個數組時,a[0]被「廣播」爲具有形狀(3,9)的數組,充滿第一行的副本。

In [30]: a == a[0] 
Out[30]: 
array([[ True, True, True, True, True, True, True, True, True], 
     [ True, False, True, True, True, True, False, False, False], 
     [False, False, False, True, False, True, True, True, False]], dtype=bool) 

沿着比較結果的第一個軸使用all

In [31]: np.all(a == a[0], axis=0) 
Out[31]: array([False, False, False, True, False, True, False, False, False], dtype=bool) 
+0

偉大的'矢量化'解決方案!這就是我一直在尋找的,謝謝! – huckleg