numpy使用

最近频繁接触numpy,不管是Machine Learning还是opencv,都要用到它。这里写一篇简单的使用手册,以便查阅。

生成数列,简单变形

1
2
3
4
5
6
x = numpy.linspace(1, 8, 8) # ① 生成等差数列
print(x)

print(x.reshape((2, 4))) # ② 变形成 2*4 的矩阵

print(x.reshape((2, 2, 2))) # ③ 变形成 2*2*2 的矩阵

输出:

1
2
3
4
5
6
7
8
9
10
[ 1.  2.  3.  4.  5.  6.  7.  8.]   ①

[[ 1. 2. 3. 4.] ②
[ 5. 6. 7. 8.]]

[[[ 1. 2.] ③
[ 3. 4.]]

[[ 5. 6.]
[ 7. 8.]]]

变形前后的数组共享内存

变形后的数组和原数组共享内存,因此修改变形的数组,原数组也会变:

1
2
3
4
5
x = numpy.linspace(1, 8, 8)
y = x.reshape(2, 4)
y[1, 1] = 10
print(y) # ① y
print(x) # ② x

输出:

1
2
3
4
[[  1.   2.   3.   4.]                      ① y
[ 5. 10. 7. 8.]]

[ 1. 2. 3. 4. 5. 10. 7. 8.] ② x

参数为-1的变形

变形的参数为-1,会根据数组长度和剩余维度推断出来:

1
2
x = numpy.linspace(1, 8, 8)
print(x.reshape(-1, 2, 2))

输出:

1
2
3
4
5
[[[  1.   2.]
[ 3. 4.]]

[[ 5. 10.]
[ 7. 8.]]]

矩阵初始化

1
2
3
4
5
x = numpy.zeros((2, 3, 4), numpy.uint8)	# ① 初始化 2*3*4 全0矩阵
print(x)

x = numpy.ones((2, 3, 4), numpy.uint8) # ② 初始化 2*3*4 全1矩阵
print(x)

输出:

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

[[0 0 0 0]
[0 0 0 0]
[0 0 0 0]]]

[[[1 1 1 1] ②
[1 1 1 1]
[1 1 1 1]]

[[1 1 1 1]
[1 1 1 1]
[1 1 1 1]]]

如下使用array、linspace和zeros三种写法得出的数据结构是相同的:

1
2
3
4
5
6
7
8
9
x = numpy.array([[1, 2], [3, 4], [5, 6]], numpy.uint8)        # ①
y = numpy.linspace(1, 6, 6, dtype=numpy.uint8).reshape(3, 2) # ②
z = numpy.zeros((3, 2), numpy.uint8) # ③
z[:, 0] = [1, 3, 5]
z[:, 1] = [2, 4, 6]

print(x)
print(y)
print(z)

输出:

1
2
3
4
5
6
7
8
9
[[1 2]  ① x
[3 4]
[5 6]]
[[1 2] ② y
[3 4]
[5 6]]
[[1 2] ③ z
[3 4]
[5 6]]

矩阵赋值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
x = numpy.ones((2, 3, 4), numpy.uint8)
x[:] = 2 # ① 全部赋值为2
print(x)

x = numpy.ones((2, 3, 4), numpy.uint8)
x[1, :, :] = 4 # ② 修改第1维(0 based)的所有数据为4
print(x)

x = numpy.ones((2, 3, 4), numpy.uint8)
x[:, 1, :] = 4 # ③ 修改第2维为1(0 based)的所有数据为4
print(x)

x = numpy.ones((2, 3, 4), numpy.uint8)
x[:, :, 1] = 4 # ④ 修改第3维为1(0 based)的所有数据为4
print(x)

输出:

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
[[[2 2 2 2]     ① 全部赋值为2
[2 2 2 2]
[2 2 2 2]]

[[2 2 2 2]
[2 2 2 2]
[2 2 2 2]]]

[[[1 1 1 1] ② 修改第1维为1(0 based)的所有数据为4
[1 1 1 1]
[1 1 1 1]]

[[4 4 4 4]
[4 4 4 4]
[4 4 4 4]]]

[[[1 1 1 1] ③ 修改第2维为1(0 based)的所有数据为4
[4 4 4 4]
[1 1 1 1]]

[[1 1 1 1]
[4 4 4 4]
[1 1 1 1]]]

[[[1 4 1 1] ④ 修改第3维为1(0 based)的所有数据为4
[1 4 1 1]
[1 4 1 1]]

[[1 4 1 1]
[1 4 1 1]
[1 4 1 1]]]

修改某列为一个序列

1
2
3
4
x = numpy.ones((2, 3, 4), numpy.uint8)
x[:, :, 1] = [2, 3, 4]
print(x)
print('\n')

输出:

1
2
3
4
5
6
7
[[[1 2 1 1]
[1 3 1 1]
[1 4 1 1]]

[[1 2 1 1]
[1 3 1 1]
[1 4 1 1]]]

x相当于由2个3*4的矩阵组成,此处给每个矩阵的第1列赋值为[2, 3, 4]。左值元素的个数必须等于矩阵的行数3,否则会出错。

参考

官网手册
NumPy v1.11手册中文版
本文涉及的代码放在numpySamples.py

安装

如果是python2
$ pip install scipy
如果是python3,可以执行:
$ python3 -m pip install scipy