python numpy减去矩阵元素

时间:2015-12-26 15:55:26

标签: python arrays numpy matrix

使用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]

对角线将是矩阵中零值的矩阵。

我该如何做到这一点?

1 个答案:

答案 0 :(得分:2)

您的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 array而不是matrix,因为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,可以认为是3x3阵列的3x3阵列。是的,对角元素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.]])