2017-10-17 55 views
1

如何刪除numpy數組中所有具有相同值的列?例如,如果我有這樣的矩陣:如何刪除numpy中具有相同值的列

[0 1 2 3 1]

[0 2 2 1 0]

[0 4 2 3 4]

[0 1 2 3 4]

[0 1 2 4 5]

我希望得到一個新的矩陣,看起來像這樣:

[1 3 1]

[2 1 0]

[4 3 4]

[1 3 4]

[1 4 5]

回答

3

可以與陣列比較如果所有對的列對相同,則該列只包含一個唯一值,可以使用布爾索引刪除該列:

a[:, ~np.all(a[1:] == a[:-1], axis=0)] 

#array([[1, 3, 1], 
#  [2, 1, 0], 
#  [4, 3, 4], 
#  [1, 3, 4], 
#  [1, 4, 5]]) 
1

使用all沿行假設

import numpy 
a = numpy.array([[0, 1, 2, 3, 1], 
       [0, 2, 2, 1, 0], 
       [0, 4, 2, 3, 4], 
       [0, 1, 2, 3, 4], 
       [0, 1, 2, 4, 5]]) 

然後

b = a == a[0,:] # compares first row with all others using broadcasting 
# b: array([[ True, True, True, True, True], 
#   [ True, False, True, False, False], 
#   [ True, False, True, True, False], 
#   [ True, True, True, True, False], 
#   [ True, True, True, False, False]], dtype=bool) 

充當逐行and操作(感謝Divakar!):

c = b.all(axis=0) 
# c: array([ True, False, True, False, False], dtype=bool) 

,您可以使用用於布爾索引

a[:, ~c] 
Out: 
array([[1, 3, 1], 
     [2, 1, 0], 
     [4, 3, 4], 
     [1, 3, 4], 
     [1, 4, 5]]) 

作爲一個醜陋的oneliner:

a[:, ~(a == a[0,:]).all(0)] 
+0

好主意開始。但是,爲什麼不簡單地做:'〜b.all(0)'並用它來掩蓋列?應該更高效,也比產品縮減和類型轉換更短。 – Divakar

+0

@Divakar謝謝,這實際上是我正在尋找的命令:D –

相關問題