Python numpy填充三维阵列的对角线0

Python numpy填充三维阵列的对角线0,python,numpy,numpy-ndarray,Python,Numpy,Numpy Ndarray,假设我有一个3D数组,如何将前二维的对角线填充为零。比如说 a = np.random.rand(2,2,3) for i in range(3): np.fill_diagonal(a[:,:,i], 0) 有没有办法替换for循环?np.diag函数返回一个2D对角矩阵 a[:,:,0] = np.diag((1,1)) 以下是解决方案之一 a = np.random.rand(2,2,3) np.einsum('iij->ij',a)[...] = 0 为对角线编制索引

假设我有一个3D数组,如何将前二维的对角线填充为零。比如说

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

有没有办法替换for循环?

np.diag函数返回一个2D对角矩阵

a[:,:,0] = np.diag((1,1))

以下是解决方案之一

a = np.random.rand(2,2,3)
np.einsum('iij->ij',a)[...] = 0
为对角线编制索引很容易-只需对两个维度使用相同的索引数组即可。因此,我们刚刚设置的0是:

In [8]: idx=np.arange(2)
In [9]: a[idx,idx,:]
Out[9]: 
array([[0, 0, 0],
       [0, 0, 0]])
并用于设置一个值:

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

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

       [[ 8,  2,  7],
        [10, 10, 10]]])