numpy 中增加channel的方法


numpy 数组中一维怎么转二维和多维?简述 numpy 中增加channel的方法。

在机器学习中,所有的数据都是向量和矩阵,而怎么根据我们所要解决的问题来调整模型以及数据的格式,也就是矩阵的维度和大小是一项重要的基本功,那么本文就具体介绍下numpy中数组的转换,也就是增加channel的方法。

一维转二维

例如我们有一个一维的numpy array,有如下方法可以转为二维

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
a = np.arange(10)
a
a.shape
b = a[:,None]
b
b.shape
'''
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
(10,)
array([[0],
[1],
[2],
[3],
[4],
[5],
[6],
[7],
[8],
[9]])
(10, 1)
'''

可以看到,a确实被转为了二维,以下方法是一样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import numpy as np
c = a[:,np.newaxis]
c
(c == b).all()
np.newaxis == None
'''
array([[0],
[1],
[2],
[3],
[4],
[5],
[6],
[7],
[8],
[9]])
True
True
'''

转为多维

时间序列预测中,我们一般需要的是(sample,time_stamp,feature)的3 个channel的数据,即一个三维矩阵,包含若干个sample,每个sample包含若干个时间序列点,而每个时间序列点有包括若干个feature,哪怕我们只是做单变量的时间序列预测,输入RNN网络例如LSTM的时候,数据也必须是三维的格式,下面我们讲一讲这么做的方法。

例如我们有一个若干个时间点每个时间点有两个特征的数据,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
a = np.arange(24).reshape((-1,2))
a.shape
a
'''
(12, 2)
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]])
'''

我们将a转化为三个channel,即可以

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
b = a[:,None,:]
b.shape
b
'''
(12, 1, 2)
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]]])
'''

以上对应着pandas的Dataframe,及我们对Dataframe取values属性,会得到一个二维矩阵,做法就如同上面一样,但是如果是Series的话,取values属性得到的是一个一维的,这时候我们的做法则是,

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

c = np.arange(12)
c
d = c[:,None,None]
d.shape
d
'''
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
(12, 1, 1)
array([[[ 0]],

[[ 1]],

[[ 2]],

[[ 3]],

[[ 4]],

[[ 5]],

[[ 6]],

[[ 7]],

[[ 8]],

[[ 9]],

[[10]],

[[11]]])
'''

减少维度

若要减少数据的维度,我们可以用的方法如下,

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
d = np.arange(12)[:,None,None]
d.shape
d
e = np.squeeze(d)
e.shape
e
'''(12, 1, 1)
array([[[ 0]],

[[ 1]],

[[ 2]],

[[ 3]],

[[ 4]],

[[ 5]],

[[ 6]],

[[ 7]],

[[ 8]],

[[ 9]],

[[10]],

[[11]]])
(12,)
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])'''