Numpy库简单使用
这篇笔记是针对numpy的简单使用,所有函数只对经常会用到的参数进行说明,今后这篇笔记也会不断在项目实践的过程中不断修改和补充内容,如果笔记中的内容出现问题,欢迎各位在评论区反映,我会及时修改的!
1.创建数组
#定义整形数组
np.array([1,4,2,5,3])
注意numpy智能定义同一类型的数据,如果数据不匹配,Numpy会向上转换
如果希望明确数组的数据类型,可以用dtype关键字:
np.array([1,2,3,4,5],dtype='float32')
#output:array([1.,2.,3.,4.,5.,],dtype='float32)
创造数组
- np.zeros(10,dtype=int) 创建一个长度为10的数组,数组的值都是0
- **np.ones((3,5),dtype=float) ** 创建一个3×5的浮点矩阵,矩阵的值都是1
- np.full((3,5),3.14) 创建一个3×5的浮点型数组,数组值都是3.14
- np.arange(0,20,2) 创建一个线性序列数组,从0开始,到20结束,步长为2(当然还是左闭右开)|结果:array([0,2,4,6,8,10,12,14,16,18])
- np.linspace(0,1,5) 创建一个5个元素的数组,这5个数均匀地分配到0~1 结果:array([0.,0.25,0.5,0.75,1.])
- np.random.random((3,3)) 创建一个3×3的,在0~1均匀分布的随机数组成的数组
- np.random.normal(0,1,(3,3)) 创建一个3×3的均值为0标准差为1的正态分布的随机数组
- np.random.randint(0,10,(3,3)) 创建一个3×3的[0,10)区间内随机整形数组
- np.eye(3) 创建一个3×3的单位矩阵
- np.empty(3) 创建一个由3个未初始化数组
NUMPY库中数据类型:
名称 | 描述 |
---|---|
bool_ | 布尔型数据类型(True 或者 False) |
int_ | 默认的整数类型(类似于 C 语言中的 long,int32 或 int64) |
intc | 与 C 的 int 类型一样,一般是 int32 或 int 64 |
intp | 用于索引的整数类型(类似于 C 的 ssize_t,一般情况下仍然是 int32 或 int64) |
int8 | 字节(-128 to 127) |
int16 | 整数(-32768 to 32767) |
int32 | 整数(-2147483648 to 2147483647) |
int64 | 整数(-9223372036854775808 to 9223372036854775807) |
uint8 | 无符号整数(0 to 255) |
uint16 | 无符号整数(0 to 65535) |
uint32 | 无符号整数(0 to 4294967295) |
uint64 | 无符号整数(0 to 18446744073709551615) |
float_ | float64 类型的简写 |
float16 | 半精度浮点数,包括:1 个符号位,5 个指数位,10 个尾数位 |
float32 | 单精度浮点数,包括:1 个符号位,8 个指数位,23 个尾数位 |
float64 | 双精度浮点数,包括:1 个符号位,11 个指数位,52 个尾数位 |
complex_ | complex128 类型的简写,即 128 位复数 |
complex64 | 复数,表示双 32 位浮点数(实数部分和虚数部分) |
complex128 | 复数,表示双 64 位浮点数(实数部分和虚数部分) |
2.数组对象的属性,基本操作方法
1.Numpy数组的属性:
每个数组都至少有以下几种属性:(假设x是一个numpy定义的数组)
属性 | 说明 |
---|---|
x.ndim | x的维度 |
x.shape | x每个维度的大小 |
x.size | x数组的总大小(有几个数字就是几) |
x.dtype | x的数据类型 |
x.itemsize | x每个数组元素字节大小 |
x.nbytes | x数组总字节大小(也就是itemsize×size) |
numpy.random中有种子值功能,使用示范:
import numpy as np
np.random.seed(12345)
x=np.random.randint(3,size=(2,3))#随便定义了一个2×3的数组,如果是三维就是size就是(2,2,5)这样的,一维直接传个数字就可以
x_temp=np.random.randint(3,size=(2,3))
print(x,'\n\n',x_temp)
#输出:
#[[2 1 1]
# [1 0 1]]
#[[2 2 1]
# [2 1 1]]
2.数组的索引
跟python列表的操作几乎完全相同,大概以下几点:
print(x1)#array[(1,2,3,4,5)]
print(x1[0])#1
print(x1[-1],x1[-2])#5 4
print(x2)#array([[1,2,3],
# [4,5,6],
# [7,8,9]])
print(x2[0,1])#4
print(x2[0])#array[(1,2,3)]
同样,跟列表相同,ndarray可以通过索引修改数值,但是对整形进行浮点型的修改,浮点型会被截断,以下面为例:
x1=np.array([1,2,3],dtype='int8')
x1[0]=3.14
print(x1)#array[(3,2,3)]
3.数组切片获取子数组
这里也是,和python列表操作几乎相同,需要注意的是以下几点:
切片:x[start=0:stop=总列数(维数):step=1]
step可以是负数,这个时候就是倒序,-2表示每隔2个取一次值逆序
stop是维度的大小,从1开始!!!而不是从0开始!!!这里跟取索引不一样
ndaary允许多维度裁切例如:
x1=np.array([[1,2,3],[4,5,6],[7,8,9]]) x1[:1,:3]#array([1,2,3])
4.创建数组的副本
跟python列表不一样的一点是:如果你对ndarray数组的切片部分进行修改,那么原来被切片的数组也会被更改,众所周知,python列表的切片属于浅拷贝,而ndarray的切片则是属于深拷贝,切片得到的不是副本而是数组数据的视图
那么怎么创建数组的副本呢?这里用**copy()**方法可以实现
>>> x
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
>>> x_copy=x.copy()
>>> x_copy
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
>>> x_copy[0,0]=5
>>> print(x_copy,x)
[[5 2 3]
[4 5 6]
[7 8 9]] [[1 2 3]
[4 5 6]
[7 8 9]]
可以看到修改了x_copy,但是原来的x并没有改变
5.数组的变形reshape()
下面这个例子演示reshape()的作用:
>>> grid=np.arange(1,10).reshape((3,3))
>>> grid
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
有一点要注意的是reshape中可以传入参数-1,意思是取符合要求的任意值的意思
还有一个np.newaxis,作用是在原来的对应维度基础上再加+1,这里作简要介绍:
>>> import numpy as np
>>> b = np.array([1, 2, 3, 4, 5, 6])
>>> c = b