python numpy数组转置和矩阵乘法

一.转置

数组转置

1.使用 array.T:

1.对于array对象,若是一维数组(行向量),array.T并不会把行向量转化成列向量,见下:

import numpy as np

A=np.array([0,1,2,3])
print("A: "+str(A))
print("A转置后:"+str(A.T))

B=np.array([[0,1,2,3],[4,5,6,7]])
print("B: "+str(B))
print("B转置后:"+str(B.T))

输出结果:

A: [0 1 2 3]
A转置后:[0 1 2 3]
B: [[0 1 2 3]
[4 5 6 7]]
B转置后:[[0 4]
[1 5]
[2 6]
[3 7]]

2.对于matrix对象,行向量使用.T可以转化成列向量

import numpy as np
C=np.matrix([0,1,2,3])
print("C: "+str(C))
print("C转置后:"+str(C.T))
D=np.array([[0,1,2,3],[4,5,6,7]])
print("D: "+str(D))
print("D转置后:"+str(D.T))

输出结果:

C: [[0 1 2 3]]
C转置后:[[0]
[1]
[2]
[3]]
D: [[0 1 2 3]
[4 5 6 7]]
D转置后:[[0 4]
[1 5]
[2 6]
[3 7]]

3.对于高维数组的转置:
首先是理解:对于二维数组,转置意味着行列下标互换,也就是
a i j a_{ij} aij变成了 a j i a_{ji} aji,同理,对于三维数组,转置的方法也是让下标互换,但是这种互换方法就不止一种了,使用array.T方法的话,默认是这种互换:i,j,k → \rightarrow j,k,i(就是向后推一位,最后一位变成第一位),见下:

B=np.array([[[0,1,2,3],
             [4,5,6,7]],
            [[8,9,10,11],
            [12,13,14,15]]])
print("B: "+str(B))
print("B转置后:"+str(B.T))

比如上面元素1的下标是(0,0,1)按照如上转置后,下标变成(0,1,0)
输出如下:

B: [[[ 0 1 2 3]
[ 4 5 6 7]]

[[ 8 9 10 11]
[12 13 14 15]]]
B转置后:[[[ 0 8]
[ 4 12]]

[[ 1 9]
[ 5 13]]

[[ 2 10]
[ 6 14]]

[[ 3 11]
[ 7 15]]]

2.使用array.transpose()方法

首先是参数介绍,如果理解了上面高维数组的转置方法,这个就好理解了,在上面的高维数组中用array.T是这种方式:i,j,k → \rightarrow j,k,i 。显然,我们还可以i,j,k → \rightarrow k,i,j
array.transpose()方法就是帮助我们这样做的:
如果参数这样写:array.transpose((0,1,2)),那么数组不变(因为下标没变,(0,1,2)与(i,j,k)相对应),
如果参数写成(0,2,1)那么对应的是i,j,k → \rightarrow i,k,j
以此类推
见下:

import numpy as np
B=np.array([[[0,1,2,3],
             [4,5,6,7]],
            [[8,9,10,11],
            [12,13,14,15]]])
print("B: "+str(B))
print("transpose后:"+str(B.transpose((0,2,1))))

比如6的初始下标是(0,1,2),transpose后下标应该是(0,2,1)
输出如下:

B: [[[ 0 1 2 3]
[ 4 5 6 7]]

[[ 8 9 10 11]
[12 13 14 15]]]
transpose后:[[[ 0 4]
[ 1 5]
[ 2 6]
[ 3 7]]

[[ 8 12]
[ 9 13]
[10 14]
[11 15]]]

再举个四维数组试一下:

import numpy as np
B=np.array([
            [[[0,1,2],
            [3,4,5]],
            [[6,7,8],
            [9,10,11]]],

            [[[12, 13, 14],
              [15, 16, 17]],
             [[18, 19, 20],
              [21, 22, 23]]],
            ])
print("B: "+str(B))
print("transpose后:"+str(B.transpose((3,0,2,1))))

比如17初始下标是(1,0,1,2),transpose后下标应该是(2,1,1,0)
输出如下:

B: [[[[ 0  1  2]
   [ 3  4  5]]

  [[ 6  7  8]
   [ 9 10 11]]]


 [[[12 13 14]
   [15 16 17]]

  [[18 19 20]
   [21 22 23]]]]
transpose后:[[[[ 0  6]
   [ 3  9]]

  [[12 18]
   [15 21]]]


 [[[ 1  7]
   [ 4 10]]

  [[13 19]
   [16 22]]]


 [[[ 2  8]
   [ 5 11]]

  [[14 20]
   [17 23]]]]

当然array.transpose()方法也支持二维的数组:

import numpy as np
B=np.array([[0,1,2,3],[4,5,6,7]])
print("B: "+str(B))
print("B转置后:"+str(B.transpose(0,1)))

输出:

B: [[0 1 2 3]
[4 5 6 7]]
B转置后:[[0 1 2 3]
[4 5 6 7]]

也可以对matrix使用transpose()方法,只需要注意matrix最多只能是二维即可,规则和上面的一样。

二.矩阵乘法

矩阵乘法

1.使用运算符 *

  • 对于array来说是对应位置相乘(点乘)(下面代码对C或D用转置会报错)
import numpy as np

A=np.array([0,1,2,3])
B=np.array([2,3,4,5])
print("A*B: "+str(A*B))

C=np.array([[0,1,2,3],[4,5,6,7]])
D=np.array([[2,3,4,5],[6,7,8,9]])
print("C*D: "+str(C*D))

输出结果:

A*B: [ 0 3 8 15]
C*D: [[ 0 3 8 15]
[24 35 48 63]]

  • 对于matrix对象,实施的是矩阵乘法:(下面代码不用转置会报错)
import numpy as np

A=np.matrix([0,1,2,3])
B=np.matrix([2,3,4,5]).T
print("A*B.T: "+str(A*B))

C=np.matrix([[0,1,2,3],[4,5,6,7]])
D=np.matrix([[2,3,4,5],[6,7,8,9]]).T
print("C*D.T: "+str(C*D))

输出结果:

A*B.T: [[26]]
C*D.T: [[ 26 50]
[ 82 170]]

2.使用numpy.multiply()方法

  • 对于array来说是对应位置相乘(点乘)(下面代码对C或D用转置会报错)
import numpy as np

A=np.array([0,1,2,3])
B=np.array([2,3,4,5])
print("A*B: "+str(np.multiply(A,B)))

C=np.array([[0,1,2,3],[4,5,6,7]])
D=np.array([[2,3,4,5],[6,7,8,9]])
print("C*D: "+str(np.multiply(C,D)))

输出结果:

A*B: [ 0 3 8 15]
C*D: [[ 0 3 8 15]
[24 35 48 63]]

  • 对于matrix来说也是对应位置相乘(点乘)(下面代码对C或D用转置会报错)
import numpy as np

A=np.matrix([0,1,2,3])
B=np.matrix([2,3,4,5])
print("A*B: "+str(np.multiply(A,B)))

C=np.matrix([[0,1,2,3],[4,5,6,7]])
D=np.matrix([[2,3,4,5],[6,7,8,9]])
print("C*D: "+str(np.multiply(C,D)))

输出结果:

A*B: [[ 0 3 8 15]]
C*D: [[ 0 3 8 15]
[24 35 48 63]]

3.使用numpy.dot()方法

  • 对于array来说是矩阵乘法(下面代码不用转置会报错(一维的不用转置,转了也没用的,原因前面有))

numpy.dot(A,B)等价于A.dot(B)

import numpy as np

A=np.array([0,1,2,3])
B=np.array([2,3,4,5])
print("A*B: "+str(np.dot(A,B)))

C=np.array([[0,1,2,3],[4,5,6,7]])
D=np.array([[2,3,4,5],[6,7,8,9]]).T
print("C*D: "+str(np.dot(C,D)))

输出结果:

A*B: 26
C*D: [[ 26 50]
[ 82 170]]

另外array这里有点小问题,我手动变成列向量,去和行向量相乘,发现会报错,没用得到理想的4x4矩阵

  • 对于matrix来说是矩阵乘法(下面代码不用转置会报错(一维的也要转置))
import numpy as np

A=np.matrix([0,1,2,3])
B=np.matrix([2,3,4,5]).T
print("A*B: "+str(np.dot(A,B)))

C=np.matrix([[0,1,2,3],[4,5,6,7]])
D=np.matrix([[2,3,4,5],[6,7,8,9]]).T
print("C*D: "+str(np.dot(C,D)))

输出结果(注意与上面对比,一维的相乘结果还是列表形式)

A*B: [[26]]
C*D: [[ 26 50]
[ 82 170]]

三.一维数组的特例

列向量*行向量:

import numpy as np

A=np.array([0,1,2,3])
B=np.array([[1],[2],[3],[4]])
print("A*B: "+str(B*A))  #A*B的结果一样

输出结果:

A*B: [[ 0 1 2 3]
[ 0 2 4 6]
[ 0 3 6 9]
[ 0 4 8 12]]

这里看似不符合之前的*规则,但是我觉得可以这样理解:
编译器在处理B*A时,把B变成

B:
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4

然后把A变成:

A:
0 1 2 3
0 1 2 3
0 1 2 3
0 1 2 3

然后再去点乘得到结果

A*B: [[ 0 1 2 3]
[ 0 2 4 6]
[ 0 3 6 9]
[ 0 4 8 12]]

减法也类似:

import numpy as np

A=np.array([0,1,2,3])
B=np.array([[1],[2],[3],[4]])
print("A-B: "+str(A-B))

输出结果:

A-B: [[-1 0 1 2]
[-2 -1 0 1]
[-3 -2 -1 0]
[-4 -3 -2 -1]]

import numpy as np

A=np.array([0,1,2,3])
B=np.array([[1],[2],[3],[4]])
print("B-A: "+str(B-A))

输出结果:

B-A: [[ 1 0 -1 -2]
[ 2 1 0 -1]
[ 3 2 1 0]
[ 4 3 2 1]]

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值