Gluon学习03-基础数据类型Ndarray

本文介绍如何Gluon的基本数据类型Ndarray

本机环境介绍:

系统:Linuxmint
Python版本:Python3


1.API介绍

MxNet版本:1.2.0
API地址:https://mxnet.incubator.apache.org/api/python/ndarray/ndarray.html

Ndarray在CPU/GPU上提供必要的张量操作,是一个多维的,固定大小的,同类型的矩阵.mxnet.ndarray与numpy.ndarray非常相似.

The NDArray class:
1.属性
shape/size/ndim/context/dtype

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
import mxnet as mx
from mxnet import nd
import numpy as np
#数据的形状
>>> x = mx.nd.array([1, 2, 3, 4])
>>> x.shape
(4L,)
>>> y = mx.nd.zeros((2, 3, 4))
>>> y.shape
(2L, 3L, 4L)

#数据的多少
>>> import numpy as np
>>> x = mx.nd.zeros((3, 5, 2))
>>> x.size
30
>>> np.prod(x.shape)
30

#数据的阶/秩
>>> x = mx.nd.array([1, 2, 3, 4])
>>> x.ndim
1
>>> x = mx.nd.array([[1, 2], [3, 4]])
>>> x.ndim
2

#数据所在的设备
>>> x = mx.nd.array([1, 2, 3, 4])
>>> x.context
cpu(0)
>>> type(x.context)

>>> y = mx.nd.zeros((2,3), mx.gpu(0))
>>> y.context
gpu(0)

#数据的类型
>>> x = mx.nd.zeros((2,3))
>>> x.dtype

>>> y = mx.nd.zeros((2,3), dtype='int32')
>>> y.dtype

2.转换

1
2
3
4
5
6
7
8
9
10
11
12
#转为标量,形状必须是(1,)
>>> x = mx.nd.ones((1,), dtype='int32')
>>> x.asscalar()
1
>>> type(x.asscalar())

#复制
>>> x = mx.nd.ones((2,3))
>>> y = x.copy()
>>> y.asnumpy()
array([[ 1., 1., 1.],
[ 1., 1., 1.]], dtype=float32)

3.创建

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
#通过自身API创建
>>> a=nd.arange((10))
>>> a
[0. 1. 2. 3. 4. 5. 6. 7. 8. 9.]
<NDArray 10 @cpu(0)>

>>> b=nd.zeros((2,3))
>>> b
[[0. 0. 0.]
[0. 0. 0.]]
<NDArray 2x3 @cpu(0)>

>>> c=nd.ones((2,3,1))
>>> c
[[[1.]
[1.]
[1.]]
[[1.]
[1.]
[1.]]]
<NDArray 2x3x1 @cpu(0)>

#通过list创建
>>> d=[6,5,4,3,2,1]
>>> e=nd.array(d)
>>> e
[6. 5. 4. 3. 2. 1.]
<NDArray 6 @cpu(0)>

4.形状

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
#转置
>>> x = mx.nd.arange(0,6).reshape((2,3))
>>> x.asnumpy()
array([[ 0., 1., 2.],
[ 3., 4., 5.]], dtype=float32)
>>> x.T.asnumpy()
array([[ 0., 3.],
[ 1., 4.],
[ 2., 5.]], dtype=float32)

#改变形状
>>> x = mx.nd.arange(0,6).reshape(2,3)
>>> x
[[0. 1. 2.]
[3. 4. 5.]]
<NDArray 2x3 @cpu(0)>

>>> y = x.reshape(3,2)
>>> y
[[0. 1.]
[2. 3.]
[4. 5.]]
<NDArray 3x2 @cpu(0)>

#列多少不管,就明确是n行,列= (x.size/n)上整
>>> y = x.reshape(2,-1)
>>> y
[[0. 1. 2.]
[3. 4. 5.]]
<NDArray 2x3 @cpu(0)>

#只要一行
>>> y = x.reshape(-3)
>>> y
[0. 1. 2. 3. 4. 5.]
<NDArray 6 @cpu(0)>
>>>

5.元素扩展

1
2
3
4
5
6
7
8
9
10
11
12
#拼接,输入数组的唯独应该相同
x = [[1,1],[2,2]]
y = [[3,3],[4,4],[5,5]]
z = [[6,6], [7,7],[8,8]]
concat(x,y,z,dim=0) = [[ 1., 1.],
[ 2., 2.],
[ 3., 3.],
[ 4., 4.],
[ 5., 5.],
[ 6., 6.],
[ 7., 7.],
[ 8., 8.]]

参考:
NDArray API

每日一学,争取进步03