我有一个数组:
U = np.array([3, 5, 7, 9, 11])
我想要得到如下结果:
result = np.array([
[ np.nan, np.nan, np.nan, np.nan, np.nan],
[U[0] - U[1], np.nan, np.nan, np.nan, np.nan],
[U[0] - U[2], U[1] - U[2], np.nan, np.nan, np.nan],
[U[0] - U[3], U[1] - U[3], U[2] - U[3], np.nan, np.nan],
[U[0] - U[4], U[1] - U[4], U[2] - U[4], U[3] - U[4], np.nan]
])
我可以用来np.tril_indices(4, k=-1)
获取没有对角线的下三角的索引,但下一步是什么?
一种简单的方法是计算整个差异并选择所需的元素,但这样做会做更多不必要的工作:
这是一个实际上比简单的面具更有用的时候
np.where
,虽然也可以用面具来做:更有效的方法可能是更直接地使用索引来索引源:
虽然不是最有效的,但只有几行代码:
u
。nan
。以下是使用接受的答案作为基线的计时结果- 使用
where
和使用掩码的版本似乎对于较小的尺寸具有优势; 对于较大的尺寸,差异似乎越来越可以忽略不计:用于计时的代码(请注意,我交换了减法的顺序
baseline_where()
和baseline_mask()
以符合OP的问题,同时我还修复了中的拼写错误((…)[mask]
而不是[…][mask]
)baseline_mask()
: