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