为了扩展@PlasmaBinturong和@Divakar的答案,您可以使用基于np.triu_indices
和np.tril_indices
的高级索引:
triu_idx = np.triu_indices(len(a), k=1) #finding advanced indices of upper right triangle
tril_idx = np.tril_indices(len(a), k=-1) #finding advanced indices of lower left triangle
out = np.ones(a.shape, dtype=bool)
out[triu_idx] = False #padding upper right triangle with zeros
out[tril_idx] = False #padding upper left triangle with zeros
>>> out
array([[ True, False, False],
[False, True, False],
[False, False, True]])
对于triu_idx = np.triu_indices(len(a), k=1)
,它是np.nonzero(np.less.outer(np.arange(len(a)), np.arange(len(a))))
的缩写。
对于np.tril_indices(len(a), k=-1)
,它是np.nonzero(np.greater.outer(np.arange(len(a)), np.arange(len(a))))
的缩写。
所以你可以使用np.less.outer(...)
和np.greater.outer(...)
的替代方式:
>>> np.not_equal.outer(np.arange(len(a)), np.arange(len(a)))
array([[False, True, True],
[ True, False, True],
[ True, True, False]])
在 @Divakar 的解决方案中,可以用语法糖来替换:np.arange(len(a))[:, None] != np.arange(len(a))
除此之外,我们还希望得到以下输出结果,并将其与先前的过程进行比较:
out = np.ones(a.shape, dtype=bool)
idx = np.not_equal.outer(np.arange(len(a)), np.arange(len(a)))
tri_both = np.nonzero(idx)
out[tri_both] = False
>>> out
array([[False, True, True],
[ True, False, True],
[ True, True, False]])
结论。不要将布尔索引转换为数字索引,然后再转回来。这样做效率低下,与直接使用布尔索引相比。
np.eye()
接受形状参数来创建这样的二维数组。 - Divakar