使用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]
对角线将是矩阵中零值的矩阵。
我该如何做到这一点?
答案 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.]])