您可以使用NumPy广播
-
mask = a[:,None] >= a
out = mask[~np.eye(a.size,dtype=bool)]
如果您更喜欢将mask
中的对角元素设置为False
,那么mask
将成为输出,如下所示 -
mask[np.eye(a.size,dtype=bool)] = 0
示例运行 -
In [56]: a
Out[56]: array([3, 7, 5, 8])
In [57]: mask = a[:,None] >= a
In [58]: mask
Out[58]:
array([[ True, False, False, False],
[ True, True, True, False],
[ True, False, True, False],
[ True, True, True, True]], dtype=bool)
In [59]: mask[~np.eye(a.size,dtype=bool)]
Out[59]:
array([False, False, False, True, True, False, True, False, False,
True, True, True], dtype=bool)
In [60]: mask[np.eye(a.size,dtype=bool)] = 0
In [61]: mask
Out[61]:
array([[False, False, False, False],
[ True, False, True, False],
[ True, False, False, False],
[ True, True, True, False]], dtype=bool)
运行时测试
为什么要使用 NumPy 广播
?因为它能提高性能!让我们来看一个大型数据集的例子 -
In [34]: def pairwise_comp(A):
...: a = np.asarray(A)
...: mask = a[:,None] >= a
...: out = mask[~np.eye(a.size,dtype=bool)]
...: return out
...:
In [35]: a = np.random.randint(0,9,(1000)).tolist()
In [36]: %timeit [x >= y for i,x in enumerate(a) for j,y in enumerate(a) if i != j]
1 loop, best of 3: 185 ms per loop
In [37]: %timeit pairwise_comp(a)
100 loops, best of 3: 5.76 ms per loop