2017-10-17 100 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 –

相关问题