Numpy
- Numpy 是一个开源的数值计算扩展,可以用来处理大型矩阵,比 python 自身的嵌套列表结构要高效的多
- 导入 python库使用关键字 import,后面可以自定义库的简称,一般 Numpy 为 np,pandas 为 pd
import numpy #导入库
import numpy as np #简称
from numpy import *
Numpy 数组对象及其索引
例如我们想让一个列表里面的元素每一个都加1,列表无法进行这样的操作,非常麻烦,而且列表无法进行矩阵元素的运算,所以我们引入 Numpy
从列表创建数组:
list=[1,2,3,4]
a=np.array(list)
从列表传入:
a=np.array([1,2,3,4])
生成全为0数组:
np.zero(5)
生成全为1数组:
np.ones(5,dtype='int')#默认浮点数,但参数 dtype 可以规定数据类型
用 fill 方法将数组设定为指定值:
a=np.array([1,2,3,4])
a.fill(5)#每一个元素设定为5
与列表不同,数组中要求所有元素的 dtype 是一样的,如果传入参数的类型与数组类型不一样,需要按照已有的类型进行转换
a=a.astype('float')
a.fill(2.5)
下面是使用特定方法生成特殊数组
生成整数序列:
a=np.arange(1,10)#左闭右开
a=np.arange(1,10,2)#间隔2
生成等差数列:
a=np.linspace(1,10,10)#从1-10的十个等差数列,都是闭区间
生成随机数:
np.random.rand(10)#0-1左闭右开10个随机数
np.random.randn(10)#标准正态分布
np.random.randint(1,10,10)#1-10随机整数
数组属性
查看数组类型:
type(a)#返回 numpy.ndarray
查看数组中的数据类型:
a.dtype
查看形状,会返回一个元组
a.shape
查看数组里面元素的数目:
a.size
查看数组的维度:
a.ndim
索引和切片
索引第一个元素:
a=np.array([0,1,2,3])
a[0]
修改第一个元素的值:
a[0]=10#重新赋值
切片,支持负索引:
a=np.array([11,12,13,14,15])
a[1:3]
a[1:-2]#取到倒数第二个数的前一个数
a[-4:3]#从倒数第四个元素开始取
省略参数:
a[-2:]#取14 15
a[::2]#间隔2,11 13 15
多维数组及其属性
生成二维数组:
a=np.array([[0,1,2,3],[10,11,12,13]])
查看形状:
a.shape#(2,4) 2行4列
查看总个数:
a.size# 8
查看维数:
a.ndim#2
二维数组传入两个参数索引:
a[1,3]
实际上 python 会把它们看成一个元组(1,3)
单个索引索引一整行内容:
a[1]#第二行
多维数组:
a=np.array([[0,1,2,3,4,5],
[10,11,12,13,14,15],
[20,30,40,50,60,70]])
取3,5行:
a[2::2,::2]
切片在内存中使用的是引用机制:改变 b 导致了 a 改变
a=np.array([0,1,2,3,4])
b=a[2:4]
print(b)#[2,3]
b[0]=10
print(a)#[0,1,10,3,4]
python 并没有为 b 分配新的空间来储存它的值,而是让b指向了a所分配的内存空间,因此,改变b会改变a的值,这种情况在列表中不会出现;
好处:很大的数组不用大量复制多余的值,节约空间;缺点:一个值改变另一个值
copy()来解决,会申请新的内存
a=np.array([0,1,2,3,4])
b=a[2:4].copy()
b[0]=10
花式索引:
实现任意位置的操作,需要使用花式索引 fancy slicing
a=np.arange(0,100,10)
花式索引需要指定索引位置:
index=[1,2,-3]
y=a[index]
print(y)#[10,20,70]
布尔数组来花式索引:
mask 必须是布尔值,长度必须和数组长度相同
mask=np.array([0,2,2,0,1,0,0,1,0],dtype=bool)
a[mask]
取对角线值:括号里的数值按照行列对应即可
a=np.array([[0,1,2,3,4,5],
[10,11,12,13,14,15],
[20,30,40,50,60,70]])
a[(0,1,2),(1,2,3)]#[1,12,50]
不完全索引:
只给定行索引,返回整行:
y=a[:3]
where 语句:
where(array)返回所有非零元素的索引:
a=np.array([0,12,5,20])
判断:
a>10#会返回布尔值
数组中大于10元素的索引位置:
np.where(a>10)
where 返回值是一个元组,返回的是索引位置
a[a>10]
a[np.where(a>10)]
数组类型
a=np.array([1.5,-3],dtype=float)
asarray 函数:数组类型调整
a=np.array([1,2,3])
np.asarray(a,dtype=float)#会显示浮点数
astype 方法:
a=np.array([1,2,3])
a.astype(float)#会显示浮点数,但并未复制给a,a仍然是[1,2,3]
sort 函数:排序但不赋值
a=np.array([1,2,5,3])
np.sort(a)
argsort函数:返回从小到大排列在数组中的索引位置
a=np.array([1,2,5,3])
order=np.argsort(a)
其他操作:各有两种写法,函数形式或者方法形式
#求和
a=np.array([1,2,6,5,3])
np.sum(a)
a.sum()
#最大值
np.max(a)
a.max()
#最小值
np.min(a)
a.min()
#均值
np.mean(a)
a.mean()
#标准差
np.std(a)
a.std()
#相关系数矩阵
np.cov(a)
a.cov()
多维数组操作:
#数组形状
a=np.arange(6)
a.shape=2,3
#reshape 不会改变原来数组的值,而是返回一个新的数组
a.reshape(2,3)
#转置
a.T
a.transpose()
数组连接
有时候需要将不同数组按照一定的顺序连接起来:
Concatenate((a1,a1,…,aN),axis=0)
这些数组要用()包括到一个元组中去,除了给定的轴外,这些数组其他轴的长度必须是一样的
x=np.array([[0,1,2],[10,11,12]])
y=np.array([[50,51,52],[60,61,62]])
print(x.shape)
print(y.shape)
#第一维进行连接
z=np.concatenate((x,y))
#array([[ 0, 1, 2],
# [10, 11, 12],
# [50, 51, 52],
# [60, 61, 62]])
#第二维连接
z=np.concatenate((x,y),axis=1)
#array([[ 0, 1, 2, 50, 51, 52],
# [10, 11, 12, 60, 61, 62]])
#x 和 y 是相同形状的,还可以连接成三维数组,concatenate没有这样的功能
z=np.array((x,y))
#array([[[ 0, 1, 2],
# [10, 11, 12]],
# [[50, 51, 52],
# [60, 61, 62]]])
以上三种连接方式,numpy 均提供有对应的函数:
- vstack
- hstack
- dstack
np.vstack((x,y))
np.hstack((x,y))
np.dstack((x,y))
Numpy 内置函数:
常用内置函数:
np.abs()#绝对值
np.exp()#自然对数指数幂
np.median()#中位数
np.cumsum()#累计求和
具体内置函数详见:
Numpy 内置函数文档