Numpy库
创建数组(numpy.array)
array()
np.array(object,dtype = None, copy = True ,order = None, subok = False, ndmin = 0)
-
object : 数组序列
-
dtype :更改数组的数据类型
-
copy :默认为True
-
order :以哪种内存布局创建数组
-
ndim :数组维度
-
subok:默认为False。为True时,使用object的内部数据类型;为False时:使用object数组的数据类型
import numpy as np np.array([0,1,2,3,4,5,6,7,8,9])#一维数组 np.array(range(10)) np.array([1,2,3],[4,5,6])#二维数组 np.array([i**2 for i in range(10)])
注意:1.当数组内的类型不一样时,结果以str>float>int统 2.当数组嵌套数量不一致时,结果返回一维数组
arr1 = np.array([1,2,3,'4',5.0])
arr2 = np.array([1,2,3],('a','b','c','d'))
arange()
np.arange(start,stop,step,dtype) #生成区间数组
np.arange(1,10,2,dtype = 'int')
内置函数:
1.linspace()创建等差数列
np.linspace(start,stop,num=50,endpoint=True,retstep=False,dtype=None)
-
start:必填,序列的起始值
-
stop:必填,序列的终止值,如果endpoint为true,该值包含于数列中
-
num:要生成的等步长的样本数量,默认为50
-
endpoint:该值为true时,数列中包含stop值,反正不包含,默认为True
-
retstep:如果为True时,生成的数组中会显示间距(步长),反正不显示
-
dtype:ndarray的数据类型
np.linspace(0,100,500)
2.logspace()创建等比数列
np.logspace(start,stop,num=50,endpoint=True,base=10.0,dtype=None)
-
base:对数log的底数,默认为10.0
np.logspace(0,9,base=2)
3.Numpy数组属性
(1)ndarray.ndim
秩,即轴的数量或维度的数量
(2)ndarray.shape
数组的维度,对于矩阵,n行m列
调整维度reshape
返回调整维度后的副本,而不改变原ndarray(要符合数组内的数量
np.arange(20).reshape((4,6))#这是错误的
(3)ndarray.size
数组元素的总个数,相当于.shape中的n*m的值
调整维度resize
如果新数组大于原始数组,则新数组将填充重复副本
a = np.array([1,2],[3,4])
a.resize(a,(2,3))#按顺序填充原数组
a.resize((2,3),refcheck=False)#填充0
(4)ndarray.dtype
ndarray对象的元素类型
(5)ndarray.itemsize
ndarray对象中每个元素的大小,以字节为单位
切片和索引
一维数组
和之前学的一样,略~
二维数组
-
切片为下一 维度的一个元素,所以是一维数组
-
二次索引取得,一维数组中的元素
arr3 = np.arange(20).reshape(4,5) arr3[2]#获取第三行的数组 arr3[2][2]#获取第三行第三列的一个元素 arr3[2:]#获取第三第四行的数组,为二维数组 arr3[...:1]#省略号返回所有行元素,反之为列元素
索引的高级操作
1.整数数组索引
x = np.array([
[1,2],
[3,4]
[5,6]
])
#[0,1,2]代表行索引,[0,1,0]代表列索引(一一对应)
y = x[[0,1,2],[0,1,0]]#获取x中的(0,0),(1,1),(2,0)的数据
2.布尔数组索引
当输出的结果需要经过布尔运算(如比较运算)时,此时会使用到另一种高级索引方式,即布尔数组索引。
x = np.array([[0,1,2],[3,4,5],[6,7,8],[9,10,11]])
x[x>6]
筛选出指定区间内数据
-
&和
-
|或
x = np.array([[0,1,2],[3,4,5],[6,7,8],[9,10,11]]) x[(x>4) & (x<9)] x[(x<4) | (x>9)]
True和False
True和False的形式表示需要和不需要的数据
arr = np.arange(12).reshape((3,4))
#行变量 存在3个元素
row1 = np.array([False,True,True])
#列变量 存在4个元素
column1 = np.array([True,False,True,False])
#arr是3行,做切片时也要提供3个元素的数组,轴的长度一致
arr[row1]
arr[:,column1]
arr [row1,column]
arr[[False,True,True],[True,False,True,False]]#T和F数量要一致
数组索引及切片改变原数组的数据
与以上相同,略
广播机制
指numpy对不同形状(shape)的数组进行数值计算的方式,对数组的算术运算通常在相应的元素上进行
-
如果两个数组a和b形状相同,即满足a.shape == b.shape,那么a*b的结果就是a与b数组对应为相乘。(即要求维数相同,且各维度的长度相同)
a = np.array([1,2,3,3,4]) b = np.array([10,20,30,40]) c = a * b
-
如果维度不相同,形状较小的数组,在横向或纵向上进行一定次数的重复,使其与形状较大的数组拥有相同的维度
a = np.array([[0,0,0] [10,10,10] [20,20,20] [30,30,30]]) b = np.array([1,2,3]) print(a + b)
注意:
- 两个数组的大小右对齐后,对应维度里的数值要么相等,要么为1(取大值),要么缺失取大值
- 除此之外就会报错
- 数组a大小为(2,1,3)和数组b大小为(4,2)即不能做运算
统计函数
平均值mean()
-
默认情况下为全部平均值
-
若要求某一维度的平均值,则设置axis函数,多维数组的元素指定
-
axis = 0 ,将从上往下计算
-
axis = 1 ,将从左往右计算
a = np.arange(20).reshape((4,5)) a.mean(axis=0) a.mean(axis=1)
-
中位数np.median
a = np.array([1,2,3,5,6,9,18])
np.median(a)
标准差np.std
显示数据的离散程度
a = np.array([95,85,75,65,55,45])
b = np.array([73,72,71,69,68,67])
print(np.std(a))
print(np.std(b))
方差var
同上
a = np.array([95,85,75,65,55,45])
b = np.array([73,72,71,69,68,67])
print(a.var(a))
print(b.var(b))
最大值max
a.max(axis=0)
最小值min
a.min(axis=1)
加权平均值np.average()
即将各数值乘以相应的权数,然后加总求和得到总体值,再除以总的单位数
np.average(a,axis=None,weights=None,return=False)
-
weights:数组,可选
与a中的值关联的是权重数组。a中的每个值都根据其关联的权重对平均值做出贡献。权重数组可以是一堆的(在这种情况下,它的长度必须是沿给定轴的a的大小)或与a具有相同的形状。如果weight=None,则假定a中的所有数据的权重等于1.一维计算是:
avg = sum(a*weight)/sum(weight)
a = np.array([80,90,100]) weights = np.array([0.2,0.3,0.5]) print(np.average(a,weights = weights))
数据类型
浮点型
......dtype = np.float_
字符串型
......dtype = np.str_
等等等…与python基础不一样的是最后要加_
定义结构化数据
-
b:代表布尔型
-
u:无符号整型
-
i:带符号整型(只能是i1,i2,i4,i8)
-
f:浮点型
-
c:复数浮点型
-
m:时间间隔
-
M:日期时间
-
O:python对象
#首先创建结构化数据类型 teacher = np.dtype([('name',np.str_,2),('age','i1'),('salary','f4')])#2是大小 #将其应用于ndarray对象 b = np.array([('wl',32,8327,59),('lh',28),7856.87],dtype = teacher) print(b) b['name']#取出全部姓名 b['age']#取出全部年龄
随机函数random
常用函数:
- rand():生成(0,1)均匀分布随机数
- randn():生成标准正态分布随机函数
- randint(low,high,size,dtype):生成随机整数[low,high)
- sample():生成(0,1)随机数
#创建4行2列的随机数据
np.random.rand(4,2)
随机种子np.random.seed()
使用相同的seed()值,则每次生成的随机数都相同,使得随机数可以预测
np.random.seed(1)
L1 = np.random.randn(3,3)
np.random.seed(1)
L2 = np.random.randn(3,3)
正态分布np.random.normal()
np.random.normal(loc=0.0, scale=1.0, size=None)
作用:返回一个由size指定形状的数组,数组中的值服从μ=loc,a=scale的正态分布
#标准正态分布,3行2列
a = np.random.normal(0,1,(3,2))#均值为0,标准差为1
print(a)
数组的其他函数
- resize:返回指定形状的新数组
a = np.array([1,2,3],[4,5,6])
b = np.resize(a,(3,3))
c = a.resize((3,3),refcheck=False)#填充0
-
append:将元素添加到数组的末尾
d = np.append(a,[7,8,9],axis=0)#axis=0时添加的数组元素要与原来相同(列数) e = np.append(a,[[5,5,5],[6,6,6]],axis=1)#axis=1时添加的数组个数要和原来的行数相同
-
insert:沿规定的轴将元素值插入到指定的元素前
np.insert(arr,obj(索引值),values(插入值),axis)
a = np.array([[1,2],[3,4],[5,6]]) b = np.insert(a,3,[11,12])#没有axis将返回一维数组 #沿轴0垂直方向 c = np.insert(a,1,[11],axis=0) #沿轴1水平方向 d = np.insert(a,1,11,axis=1)
-
delete:删掉某个轴上的子数组,并返回删除后的新数组(不能使用切片)
a = np.arange(12).reshape(3,4) b = np.delete(a,1,axis=1)#若不提供axis,则返回一维数组
-
argwhere:返回数组内符合条件的元素的索引值
该函数返回数组中非0元素的索引,若是多维数组则返回行,列索引组成的索引坐标
c = np.argwhere(a>1) print(c)
-
unique:用于删除数组中重复的元素,并按元素值由大道小返回一个新数组
-
sort():对输入数组执行排序,并返回一个数组副本
-
argsort:沿着指定的轴,对输入数组的元素值进行排序,并返回排序后的元素索引数组