使用的时候第一步就是导包嘛,但numpy导包要注意一点
import numpy as np
普通导包方式就是import numpy,但我们在这里加上了as np,这就相当于给numpy这个包给了一个新的引用名称np,肯定有人好奇,为什么要这样写,因为科学界的人都这样写的,约定俗成嘛,大家也都是这样写的,现在很多的数据分析书里面也是这样介绍的,所以我们也是遵循这个规则
numpy数组 创建numpy数组首先我们要想一个问题,我们要创建numpy数组肯定要往里面放数据呀,但这个数据我们是用什么样的方式来存储呢,我们必须要用现有的python数据结构出发,python现有的数据结构主要就有列表,元组,字典
-
我们先试试列表
data1 = [1,2,3,4] arr1 = np.array(data1) print(arr1)
打印结果:[1 2 3 4]
我们打印出来之后就不是列表了,变成数组了,因为中间没有逗号了 -
接下来我们创建多维数组看看
data2 = [[1,2,3,4],[5,6,7,8]] arr2 = np.array(data2) print(arr2)
打印结果:[[1 2 3 4]
[5 6 7 8]]
如果大家自己运行试试的话,我们就会发现他给我们自动分行了,在这里我是手打的,可能不是那么清晰,大家最好是自己运行一下试试,这个它体现的方式是两维四列
print(arr1.dtype) print(arr2.dtype)
两个输出结果:
int32
int32
为什么回事int32呢,这就要说一下python的这个dtype具有一个自动推导机制,你的数字不超过int32的范围,它就推导为int32,如果超过了int32,没超过int64的话,就自动推导为int64
当然了,这个dtype类型也是可以指定的
data1 = [1,2,3,4] arr1 = np.array(data1,dtype = int64) print(arr1.dtype)
这时输出结果就变成了int64,这个dtype就是你自己指定的
shape是形状,也就是表示数组每一维度的数量,n行m列这样的形式-
上面我们创建了一个二行四列的数组,我们输出一下他的形状我们看一下他的输出
print(arr2.shape)
运行结果:(2, 4)
-
我们再试试一维数组的形状是什么样的
print(arr1.shape)
运行结果:(4,)
这个有点意思呀,我们发现这个4是列数,但是输出的时候这个4却在行的位置,这是为什么呢,其实后面(4,)的意思就是只有一个4,那个逗号就可以当做不存在,就和python基础结构中的元组一样,你可以元组里面只有一个值,但是一个值的话后面必须要有一个逗号
我们继续顾名思义,zeros就是0的意思,接下来我们使用zeros函数创建数组,带着大家感受一下
-
我们先创建一个一维数组
print(np.zeros(3))
运行结果:[0. 0. 0.]
上面这个命令就是创建都为0的单位数组,列数为3,但是大家应该发现了,每个零后面都有一个小数点,这是因为默认是浮点型的数据 -
上面我们创建的是一维的,如果我们要创建多维的呢
print(np.zeros((3,4)))
运行结果:[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]
我们要创建三行四列的数组的话,就要用元组的方式,将3,4放在元组中作为参数
这个函数就是创建值都为1的数组,我们根据上面的如法炮制
-
一维数组
print(np.ones(3))
运行结果:[1. 1. 1.]
-
创建多维数组
print(np.ones((3,4)))
运行结果:
[[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]]
这个函数就和上面的两个不一样了,这个函数的目的是创建随机的垃圾数值的数组,我们以后做数据分析的话,要提前有一些垃圾数值,我们要是不想自己写的话,就可以使用这个函数,创建一些垃圾数值
-
创建一维数组
print(np.empty(3))
运行结果:[1. 1. 1.]
-
创建多维数组
print(np.empty((3,4)))
运行结果:[[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]] -
大家的疑惑:哎,不是说是创建随机的垃圾数值嘛,怎么输出的结果却和上面ones函数的值一模一样呢,是因为python中也有偷懒机制,如果你之前创建过了,它直接就取出之前内存中的值来使用,我们把之前的内容注释了,然后再运行一下看看结果
print(np.empty((3,4)))
运行结果:[[ 1.48539705e-312 -3.24721943e-109 1.09048209e-311 1.09048209e-311]
[ 1.09048209e-311 2.33419537e-313 1.50661701e-312 1.16566772e+253]
[ 1.09048209e-311 1.16546346e+166 2.27438781e+161 4.11368246e+223]]
这个函数就类似我们python中使用的range函数,都是创建范围内的值
print(np.arange(10))
运行结果:[0 1 2 3 4 5 6 7 8 9]
print(np.arange(5,15))
运行结果:[ 5 6 7 8 9 10 11 12 13 14]
eye函数和identity函数这两个函数的作用类似,都是创建正方形的单位矩阵,单位矩阵就是斜对角线都为1的矩阵,中间只要放一个参数就行,这个参数就是n行n列的单位矩阵
print(np.eye(3)) print(np.identity(3))
运行结果:
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
这两个函数的运行结果都是这样的,但我相信在这里就有朋友要问了,我如果非要用这两个函数创建长方形矩阵呢,当然也是可以的,但是结果可能就和你想的有点差别了
print(np.eye(4,2))
为什么这个函数写法不一样了,按照之前的写法,这个函数应该这样写print(np.eye((4,2)))
但这样写会报错,这个需要大家注意一下
按照我们上面的理解,这个函数创建的应该是四行两列的长方形单位矩阵
但实际的运行结果:
[[1. 0.]
[0. 1.]
[0. 0.]
[0. 0.]]
其实后面的那个参数2是截取,就是截取前两列的意思,就不可能存在长方形的单位矩阵这种东西,所以我们在这里只是对print(np.eye(4))这个的结果截取了前两列值而已
这三个函数分别就是创建形状相同的值全为0,1,垃圾值的数组
data1=[[2,3,4],[1,2,4]] arr1 = np.array(data1) print(arr1) print(np.ones_like(arr1)) print(np.zeros_like(arr1)) print(np.empty_like(arr1))
前三行代码是创建一个两行三列的数组,后三行代码的意思就是和arr1数组创建形状相同的数组
运行结果:
[[1 1 1]
[1 1 1]]
[[0 0 0]
[0 0 0]]
[[0 0 0]
[0 0 0]]
注意:empty_like是创建同样行列的垃圾值,但是如果上面创建过同样类型的值的话,它就会直接调用之前内存中的值