NumPy提供了一种新的数据类型:多维数组。数组只能够存储相同的数据类型(如字符型,数值型)。
1、使用import关键词导入NumPy模块
import NumPy as np #导入NumPy模块,并缩写为np
2、创建数据类型:数组(一维)
- array()
print(np.array([1,3,4,5,8]))
[1 3 4 5 8]
- arange()
print(np.arange(12)) #创建长为12的随机数组
[ 0 1 2 3 4 5 6 7 8 9 10 11]
print(np.arange(0,10,0.5)) #起始值,终止值,步长
[0. 0.5 1. 1.5 2. 2.5 3. 3.5 4. 4.5 5. 5.5 6. 6.5 7. 7.5 8. 8.5 9. 9.5]
- linspace()
print(np.linspace(0,5,3)) #起始值,终止值,生成的数组中的数的个数
[0. 2.5 5. ]
3、生成多维的数组矩阵
- 直接定义多维数据矩阵
a = np.array([[1, 2, 3],[4, 5, 6],[1,2,4]])
print(a)
[[1 2 3]
[4 5 6]
[1 2 4]]
print(a.shape,a.dtype,a.size,a.ndim)
#a.shape 数组矩阵几行几列
#a.dtype 数组中的值的类型(前面有提到数组中每一个值的数据类型都要相同,和集合等数据类型不同)
#a.size 数组中一共有多少个值
#a.ndim 数组是几维
((3L, 3L), dtype('int32'), 9, 2)
- 定义一维矩阵后,通过reshape()改变维度
b=np.arange(12,24,2)
print(b)
print(b.shape)
c=b.reshape(2,3) #reshape()的变化要重新赋值给一个新的变量
print(c)
print(c.shape)
[12 14 16 18 20 22]
(6L,)[[12 14 16]
[18 20 22]]
(2L, 3L)
注意:操作变动之后,要重新赋值给一个新的变量。
注意:(6L,),(1L,6L)的区别,前者代表这个数组是一个一维的,而后者代表这个数据是一个二维的,有1行6列。
4、已知维度的数组矩阵,填充数组
- 使用完全相同的数字填充数组
zero = np.zeros((3,2)) #用0填充,此处的细节要注意,两个括号
print(zero)
one = np.ones((2,3)) #用1填充
print(one)
[[0. 0.]
[0. 0.]
[0. 0.]][[1. 1. 1.]
[1. 1. 1.]]
- 使用随机数填充数组
rag1 = np.random.rand(2,4) #0和1之间均匀分布的随机数
print(rag1)
rag2 = np.random.randn(2,4) #均值为0,标准差为1的标准(高斯)正态分布
print(rag2)
(我统计学的知识相对很薄弱)
[[0.80834787 0.22204169 0.94490411 0.606424 ]
[0.80399474 0.22150397 0.35677681 0.58908173]][[ 0.67043275 0.44090229 0.93088135 -0.15631505]
[-0.1101033 2.01060774 -0.26952055 -1.44650271]]
5、数组切片(把数组比作一根火腿的话,只对火腿的部分感兴趣,要切出这一部分)
(1)一维数据的切片(没有什么新意的地方,类比于列表)
#定义示例数组
sen = np.array([1,2,3,5,7])
[1 2 3 5 7]
- 两个冒号的情况
print(sen[1:3]) #切取第1,2数
print(sen[:4]) #切取第0,1,2,3数
print(sen[2:]) #切取第2至最后
print(sen[1:-2]) #切取第1至-3数
[2 3]
[1 2 3 5]
[3 5 7]
[2 3]
- 三个冒号的情况
print(sen[::2]) #间隔为2
print(sen[0:4:2]) #前两个数组规定截取区间,第三个数字规定截取间隔
print(sen[::-1]) #逆转
[1 3 7]
[1 3]
[7 5 3 2 1]
(2)二维数组的切片
定义二维数组:
a = np.arange(12) #先定义一维的随机矩阵
a.shape=(4,3) #这里容易犯错,定义a.shape()的行和列,有4行3列
print(a) #打印矩阵
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
- 提取特定位置的数([ 行][列])
print(a[0][1]) #两个方括号,规定行和列的索引
1
- 提取特定行或列(逗号的妙用,注意位置,用逗号区分行和列,冒号继续沿用一维时的作用,这里暂时不明白可以自行修改,看看弹出的结果)
print(a[1,:]) #引入逗号,注意逗号的位置,在后面
print(a[:,2]) #在前面
[3 4 5]
[ 2 5 8 11]
- 提取特定行/列的特定的切片(逗号和冒号的混搭)
print(a[1,0:2]) #第索引为1的行中的第0至1的数值
[3 4]
print(a[1:3:2,])
[[3 4 5]]
6、文件操作
(1)将数组保存到文件(savetxt()的使用)
np.savetxt("data.txt",a) #a为之前使用到的多维数组
在同一个文件夹下找到data.txt文档
(2)将文件读取进数组
b=np.loadtxt("data.txt") #从data.txt文档中读取数组
print(b)
7、建立副本(copy())
为什么要建立副本?
问题的起源:将原始数组赋值到另一个变量。在对新的变量进行操作的时候会改变原始的数组。因此我们需要建立副本,不改变原始数据。
c=a #赋值操作
c[0][0]=2 #将c中的索引为[0][0]的数变为2
print(c) #打印c
print(a) #打印a
#c
[[ 21 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]#a 可以看到a也因此改变了
[[ 2 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
为了避免这种事情的出现,我们要使用copy()函数,建立副本。在对副本进行操作的过程中,不会改变原始数据。
b = a.copy() #建立a的副本,也可以b = a[:2,].copy()
b[0][0] =2 #改变b中的数值
print(b) #打印矩阵b
print(a) #打印矩阵a
#b
[[ 2 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]#a,未改变
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
8、矩阵的乘法(dot())
a = np.arange(9,dtype=int)
a.shape=(3,3)
print(a)
d = np.dot(a,a)
print(d)
#原始定义的矩阵
[[0 1 2]
[3 4 5]
[6 7 8]]#乘之后的结果(关于具体的细节,参看线性代数会更好)
[[ 15 18 21]
[ 42 54 66]
[ 69 90 111]]
以上是关于numpy模块中的部分函数的简单操作,那么在实际的使用过程中,要根据自己实际的项目要求,继续深化理解。
通过这样一个小小的实例的学习,我明白了在Python中一个具体的模块应该如何import,以及模块中的函数应该如何具体的应用于自己的实际需求。