0. 回顾
之前我们学习了单个数组的操作方法,这一节我们将学习多个数组的操作。
1. 数组操作
1.1 连接数组
利用vstack()函数执行垂直入栈操作,即沿着第一个轴进行操作。
示例1:
import numpy as np
a = np.arange(8).reshape([2, 4])
print('a:', a)
b = np.arange(8, 16).reshape([2, 4])
print('b:', b)
c = np.vstack([a, b])
print('c:', c)
运行结果为:
a: [[0 1 2 3]
[4 5 6 7]]
b: [[ 8 9 10 11]
[12 13 14 15]]
c: [[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]
可以看到,此时,b矩阵在列上进行添加。
示例2:利用hstack()函数执行行操作。
import numpy as np
a = np.arange(8).reshape([2, 4])
print('a:', a)
b = np.arange(8, 16).reshape([2, 4])
print('b:', b)
c = np.hstack([a, b])
print('c:', c)
运行结果为:
a: [[0 1 2 3]
[4 5 6 7]]
b: [[ 8 9 10 11]
[12 13 14 15]]
c: [[ 0 1 2 3 8 9 10 11]
[ 4 5 6 7 12 13 14 15]]
1.2 数组切分
同样,对于切分,也有相似的操作。
示例3:利用hsplit()函数进行行操作,即垂直切分。
import numpy as np
a = np.arange(8).reshape([2, 4])
print('a:', a)
d, e = np.hsplit(a, 2)
print('d:', d)
print('e:', e)
运行结果为:
a: [[0 1 2 3]
[4 5 6 7]]
d: [[0 1]
[4 5]]
e: [[2 3]
[6 7]]
示例4:利用vsplit()函数进行操作,即垂直切分。
import numpy as np
a = np.arange(8).reshape([2, 4])
print('a:', a)
d, e = np.vsplit(a, 2)
print('d:', d)
print('e:', e)
运行结果为:
a: [[0 1 2 3]
[4 5 6 7]]
d: [[0 1 2 3]]
e: [[4 5 6 7]]
示例5:利用split进行分割,这个可以将数组分为几个不对称的部分。
import numpy as np
a = np.arange(8).reshape([2, 4])
print('a:', a)
d, e, f = np.split(a, [1, 3], axis=1)
print('d:', d)
print('e:', e)
print('f:', f)
运行结果为:
a: [[0 1 2 3]
[4 5 6 7]]
d: [[0]
[4]]
e: [[1 2]
[5 6]]
f: [[3]
[7]]
可以看到,此时axis=1则是从【0 1 2 3】开始划分,【1, 3】则是第一部分从开始到第一行,也就是0,第二部分从第一行到第三行,不包括第三行,也就是【1 2】,最后就是第三行到最后,也就是3,整个是从第0行开始计算。
2. 常用概念
2.1 对象的副本或视图
跟Python的机制相似,此时会有副本和视图的区别。其中,赋值运算不会为数组创建副本,只是数组的一个视图。
示例6:
import numpy as np
a = np.arange(8).reshape([2, 4])
b = a
print(b)
a[0] = 2
print(b)
运行结果为:
[[0 1 2 3]
[4 5 6 7]]
[[2 2 2 2]
[4 5 6 7]]
可以看到,此时改变a的值,b的值也会跟着改变。
示例7:利用切片进行操作,这与Python不同,Python得到的是副本,而numpy得到的是视图。
import numpy as np
a = np.arange(8).reshape([2, 4])
b = a[:, 0:2]
print(b)
a[0, 0] = 2
print(b)
运行结果为:
[[0 1]
[4 5]]
[[2 1]
[4 5]]
如果想得到数组的副本,则利用copy()函数进行操作。
示例8:
import numpy as np
a = np.arange(8).reshape([2, 4])
b = np.copy(a)
print(b)
a[0, 0] = 2
print(b)
运行结果为:
[[0 1 2 3]
[4 5 6 7]]
[[0 1 2 3]
[4 5 6 7]]
可以看到,此时改变a数组的值,b数组并没有发生改变,故此时为创建了一个副本,且numpy的副本是深拷贝,两个数组是完全独立的。
2.2 广播机制
广播机制是针对两个形状不同的矩阵进行的,最简单的情况是一个为多维数组,另一个为一维数组。
示例9:
import numpy as np
a = np.arange(8).reshape([2, 4])
b = np.arange(4)
print(a)
print(b)
print(a + b)
运行结果为:
[[0 1 2 3]
[4 5 6 7]]
[0 1 2 3]
[[ 0 2 4 6]
[ 4 6 8 10]]
可以看到,此时是b进行复制跟a同维度之后再进行运算的。
示例10:
import numpy as np
a = np.arange(8).reshape([2, 4, 1])
b = np.arange(8).reshape([2, 1, 4])
print(a + b)
运行结果为:
[[[ 0 1 2 3]
[ 1 2 3 4]
[ 2 3 4 5]
[ 3 4 5 6]]
[[ 8 9 10 11]
[ 9 10 11 12]
[10 11 12 13]
[11 12 13 14]]]
3. 数组数据文件的读写
3.1 二进制文件的读写、
numpy的save()函数利用二进制格式保存数据。
示例11:save()函数保存数组。
import numpy as np
a = np.random.random(8).reshape([2, 4])
print(a)
np.save('a', a)
此时就成功保存了,要读取则利用load()函数。
示例12:load()函数读取数组。
import numpy as np
a = np.load('a.npy')
print(a)
运行结果为:
[[0.89027157 0.63726405 0.28353646 0.00572878]
[0.23007697 0.54250798 0.31191131 0.54195333]]
3.2 读取文件中列表形式数据
numpy可以利用genfromtxt()函数进行读取,不过,现在较为常用的是利用pandas库进行实现的,故在此不做较多的叙述。