【发布时间】:2016-10-02 21:26:44
【问题描述】:
我有一个问题,我想识别和删除逻辑矩阵中作为其他列子集的列。即 [1, 0, 1] 是 [1, 1, 1] 的子集;但 [1, 1, 0] 和 [0, 1, 1] 都不是彼此的子集。我写了一段快速的代码来识别作为子集的列,它使用一对嵌套的 for 循环进行 (n^2-n)/2 检查。
import numpy as np
A = np.array([[1, 0, 0, 0, 0, 1],
[0, 1, 1, 1, 1, 0],
[1, 0, 1, 0, 1, 1],
[1, 1, 0, 1, 0, 1],
[1, 1, 0, 1, 0, 0],
[1, 0, 0, 0, 0, 0],
[0, 0, 1, 1, 1, 0],
[0, 0, 1, 0, 1, 0]])
rows,cols = A.shape
columns = [True]*cols
for i in range(cols):
for j in range(i+1,cols):
diff = A[:,i]-A[:,j]
if all(diff >= 0):
print "%d is a subset of %d" % (j, i)
columns[j] = False
elif all(diff <= 0):
print "%d is a subset of %d" % (i, j)
columns[i] = False
B = A[:,columns]
解决办法应该是
>>> print B
[[1 0 0]
[0 1 1]
[1 1 0]
[1 0 1]
[1 0 1]
[1 0 0]
[0 1 1]
[0 1 0]]
不过,对于大型矩阵,我确信有一种方法可以更快地做到这一点。一个想法是在我去的时候消除子集列,所以我不检查已经知道是子集的列。另一个想法是将其向量化,因此没有 O(n^2) 操作。谢谢。
【问题讨论】:
标签: python numpy matrix scipy vectorization