python numpy减去矩阵元素

使用numpy,我如何相互减去矩阵的numpy数组的元素?

a = np.array([ [ [1., 2., 3.],    [4., 5., 6.],    [7., 8., 9.]    ],
               [ [20., 21., 22.], [23., 24., 25.], [26., 27., 28.] ],
               [ [30., 31., 32.], [33., 34., 35.], [36., 37., 38.] ]
             ])

或者用简单的英语:

a = ([matrix1], [matrix2], [matrix3])

我想得到一个np.array计算如下:

[matrix1-matrix1][matrix1-matrix2][matrix1-matrix3]

[matrix2-matrix1][matrix2-matrix2][matrix2-matrix3]

[matrix3-matrix1][matrix3-matrix2][matrix3-matrix3]

对角线将是矩阵中具有零值的矩阵.

我怎么能做到这一点?

最佳答案 你的a是一个3d数组

In [258]: a = np.array([ [ [1., 2., 3.],    [4., 5., 6.],    [7., 8., 9.]    ],
   .....:                [ [20., 21., 22.], [23., 24., 25.], [26., 27., 28.] ],

   .....:                [ [30., 31., 32.], [33., 34., 35.], [36., 37., 38.] ]
   .....:              ])
In [259]: a.shape
Out[259]: (3, 3, 3)

可以使用索引访问2d数组

In [260]: a[0,:,:]
Out[260]: 
array([[ 1.,  2.,  3.],
       [ 4.,  5.,  6.],
       [ 7.,  8.,  9.]])

并且可以获得3个2d数组的元组:

In [261]: (a[0,:,:],a[1,:,:],a[2,:,:])
Out[261]: 
(array([[ 1.,  2.,  3.],
        [ 4.,  5.,  6.],
        [ 7.,  8.,  9.]]), 
 array([[ 20.,  21.,  22.],
        [ 23.,  24.,  25.],
        [ 26.,  27.,  28.]]), 
 array([[ 30.,  31.,  32.],
        [ 33.,  34.,  35.],
        [ 36.,  37.,  38.]]))

这相当于您的(matrix1,matrix2,matrix3)表达式.我使用的是2d数组而不是矩阵,因为numpy有一个名为matrix的数组子类,因此该术语可能会令人困惑.

生成子阵列交叉差异的一种方法是使用广播.我使用None语法来扩展a的维度.

In [262]: a[:,None,:,:]-a[None,:,:,:]
Out[262]: 
array([[[[  0.,   0.,   0.],
         [  0.,   0.,   0.],
         [  0.,   0.,   0.]],

        [[-19., -19., -19.],
         [-19., -19., -19.],
         [-19., -19., -19.]],

        ...

        [[ 10.,  10.,  10.],
         [ 10.,  10.,  10.],
         [ 10.,  10.,  10.]],

        [[  0.,   0.,   0.],
         [  0.,   0.,   0.],
         [  0.,   0.,   0.]]]])
In [263]: _.shape
Out[263]: (3, 3, 3, 3)

这个新阵列的形状是4d,可以认为是3×3阵列的3×3阵列.是的,对角元素A [i,i,:,:]都是0.

In [264]: A=a[:,None,:,:]-a[None,:,:,:]
In [265]: A[2,2,:,:]
Out[265]: 
array([[ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.]])
点赞