微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

numpy 填充 3D 数组的对角线 0

如何解决numpy 填充 3D 数组的对角线 0

假设我有一个 3D 数组,如何将前两个维度的 diag 填充为零。例如

a = np.random.rand(2,2,3)
for i in range(3):
    np.fill_diagonal(a[:,:,i],0)

有没有办法替换 for 循环?

解决方法

以下是解决方案之一

a = np.random.rand(2,2,3)
np.einsum('iij->ij',a)[...] = 0
,

np.diag 函数返回一个二维对角矩阵。

a[:,:,0] = np.diag((1,1))
,
In [6]: a = np.random.randint(1,10,(2,3))
   ...: for i in range(3):
   ...:     np.fill_diagonal(a[:,i],0)
In [7]: a
Out[7]: 
array([[[0,0],[7,4,4]],[[8,7],[0,0]]])

索引对角线很容易 - 只需为两个维度使用相同的索引数组。因此我们刚刚设置的 0 是:

In [8]: idx=np.arange(2)
In [9]: a[idx,idx,:]
Out[9]: 
array([[0,0]])

并用于设置一个值:

In [10]: a[idx,:] = 10
In [11]: a
Out[11]: 
array([[[10,10],[ 7,[[ 8,[10,10]]])

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。