如何刪除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]
如何刪除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 –