如何删除numpy中具有相同值的列
问题描述:
如何删除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]
答
可以与阵列比较如果所有对的列对相同,则该列只包含一个唯一值,可以使用布尔索引删除该列:
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]])
答
使用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)]
好主意开始。但是,为什么不简单地做:'〜b.all(0)'并用它来掩盖列?应该更高效,也比产品缩减和类型转换更短。 – Divakar
@Divakar谢谢,这实际上是我正在寻找的命令:D –