【问题标题】:python numpy subtract elements that are matricespython numpy减去作为矩阵的元素
【发布时间】:2015-12-26 15:55:26
【问题描述】:

使用 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 数组。练习在各个维度上对其进行索引。

标签: python arrays numpy matrix


【解决方案1】:

您的 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)

二维数组可以通过索引访问

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

可以通过以下方式获得 3 个二维数组的元组:

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.]])

【讨论】:

    猜你喜欢
    • 2018-08-11
    • 2021-12-30
    • 2022-01-17
    • 2019-02-03
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    • 2022-06-30
    • 2014-12-07
    相关资源
    最近更新 更多