用于矩阵维度的转换
transpose函数的使用
用法说明
1
nums.transpose(dims)
nums
为np.ndarray
类型的对象dims
为表示维度排列的tuple
- 对于二维矩阵,只有
0, 1
两个维度,所以只能是(0,1), (1,0)
- 三维矩阵,有
0,1,2
三个维度,所以可以是是(0,1,2)
的所有全排列,共6个
- 对于二维矩阵,只有
简单易懂的解释
- 只改变维度, 每一维度对应的数据不会变, 比如图片的
shape
为:(28, 28, 3)
,那么无论怎么变化维度, 变换后的数据中维度大小为3
的那个维度都是表示通道,(28,28)
总是表示图片的每个通道的数据 - 原始
numpy.ndarray
,shape
为(2,3,4)
.transpose((0,1,2))
:shape
为(2,3,4)
, 不变.transpose((1,0,2))
:shape
为(3,2,4)
.transpose((2,1,0))
:shape
为(4,3,2)
- 测试代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54import numpy as np
origin = np.random.random_integers(1, 100, (2,3,4))
print("-"*20 + "origin")
print(origin)
print("-"*20 + "(0,1,2)")
print(origin.transpose((0,1,2)))
print("-"*20 + "(1,0,2)")
print(origin.transpose((1,0,2)))
print("-"*20 + "(2,1,0)")
print(origin.transpose((2,1,0)))
# Output:
--------------------origin
[[[50 36 80 53]
[45 45 94 91]
[49 29 69 53]]
[[85 83 61 18]
[16 89 80 60]
[99 13 36 40]]]
--------------------(0,1,2)
[[[50 36 80 53]
[45 45 94 91]
[49 29 69 53]]
[[85 83 61 18]
[16 89 80 60]
[99 13 36 40]]]
--------------------(1,0,2)
[[[50 36 80 53]
[85 83 61 18]]
[[45 45 94 91]
[16 89 80 60]]
[[49 29 69 53]
[99 13 36 40]]]
--------------------(2,1,0)
[[[50 85]
[45 16]
[49 99]]
[[36 83]
[45 89]
[29 13]]
[[80 61]
[94 80]
[69 36]]
[[53 18]
[91 60]
[53 40]]]
与reshape的区别
reshape
的用法:
1 | nums.reshape(shape) |
* `nums`为`np.ndarray`类型的对象
* `shape`为表示维度排列的`tuple`
* `shape`必须与原始`nums.shape`兼容,即每个`shape`元素相乘的结果相等
- 从
numpy
中矩阵的存储开始讲起,numpy
存储数据是C++的方式存储为一行的,然后分为不同shape
以不同方式进行索引 reshape
相当于是把原始数据先还原成一行(实际上没操作),然后再转变成指定shape
的数据,本质上数据存储没变化,只是shape
变了,以后索引方式也就变了
区别
reshape
修改的只是shape
,每个维度的意义变了transpose
修改的只是维度,同时shape
跟着变化而已,每个维度的顺序变了,但是意义不会变