numpy基础
- numpy
- 创建数组(矩阵)
- 数值类型操作
- 数组的形状
- 数组的运算
- 轴
- 读取数据
- 索引和切片
- 修改数值
- 数组的拼接
- 数组的行列交换
- 初始化数值
- 生成随机数
- copy和view
- nan和inf
- 常见数值计算函数
numpy
一个在Python中做科学计算的基础库,重在数值计算,也是大部分Python科学计算库的基础库,多用于在大型、多维数组上执行数值运算
创建数组(矩阵)
import numpy as np
#使用numpy得到ndarray类型数组
#np.arange的用法: arange([start,] stop[, step,],dtype=None)
a=np.array([1,2,3,4,5])
b=np.array(range(1,6))
c=np.arange(1,6)
print(a)
print(type(c))#c的类型
print(a.dtype)#a中数据类型
输出结果
[1 2 3 4 5]
<class 'numpy.ndarray'>
int32
数值类型操作
import numpy as np
import random
#指定创建的数组的数据类型:
a=np.array([1,0,1,0],dtype=np.bool)#或者使用dtype='?'
print(a)
#修改数组的数据类型:
a=a.astype("i1")#或者使用a.astype(np.int8)
print(a)
#修改浮点型的小数位数:
b=np.array([ random.random() for i in range(10)])
b=np.round (b,3)#保留3位小数
print(b)
输出结果:
[ True False True False]
[1 0 1 0]
[0.794 0.253 0.33 0.056 0.099 0.836 0.491 0.237 0.862 0.566]
数组的形状
import numpy as np
a=np.asarray(range(12))
print(a)
print(a.shape)#查看数组形状
b=np.asarray([[1,2,3],[4,5,6]])
print(b.shape)
c=a.reshape(3,4)
d=a.reshape(2,2,3)#三维第一个是块数
e=b.reshape(6)#或使用b.flatten()展开成1维数组
f=b.reshape((1,6))
print(c)
print(d)
print(e)
print(f)
输出结果:
[ 0 1 2 3 4 5 6 7 8 9 10 11]
(12,)
(2, 3)
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[[ 0 1 2]
[ 3 4 5]] #3维第一维度为分块
[[ 6 7 8]
[ 9 10 11]]]
[1 2 3 4 5 6]
[[1 2 3 4 5 6]]
数组的运算
当两个形状相同的数组运算时,加减乘除等均是对应位置数字相加减乘除
当两个数组形状不同的时候,若在某一维度上相同则可以运算
轴
在numpy中轴可以理解为方向,使用0,1,2…数字表示,对于1维数组,只有一个0轴,对于2维数组有0轴和1轴,对于3维数组有0,1,2轴
二维数组
三维数组
读取数据
loadtxt(fname, dtype=float, comments='#', delimiter=None,
converters=None, skiprows=0, usecols=None, unpack=False,ndmin=0,
encoding='bytes', max_rows=None)
frame:文件、字符串或产生器,可以是.gz或bz2压缩文件
dtype:数据类型,可选,默认np.float,默认情况下对于较大的数据会将其变为科学计数的方式
delimiter:分隔字符串,默认是空格,不指定会导致每行数据为一个整体的字符串
skiprows:跳过前x行,一般跳过第一行表头
usecols:读取指定的列,索引,元组类型
upack :默认是False(0),默认情况下,有多少条数据,就会有多少行。为True(1)的情况下,每一列的数据会组成一行,原始数据有多少列,加载出来的数据就会有多少行,相当于转置的效果
#对数组进行进行转置
a=a.transpose()
a=a.T
索引和切片
#取二维数组a的行(下标从0开始)
a[2]#第三行
a[2:]#取从第三行开始的连续多行构成新数组
a[x,y,z]#取x y z 三行构成新数组
#或者
a[1,:]#第二列
.....
#取二维数组a的列
#取列
a[:,0]#第一列
a[:,1:]#第一列开始的连续的列
a[:,[0,2]]#第一列和第三列
#取多行多列
a[2,3]#取三行四列处的值
a[2:5,1:4]#取3行到5行 2列到4列 (包头不包尾)
#取多个不相邻的点
a[[0,2],[2,1]]
修改数值
#通过上述获得索引再修改数值
a[[0,2],[2,1]]=0
#讲a中小于3的数值换成10
a[a<3]=10
#numpy的三元运算符
np.where(a<3,100,400)#小于3的数字换成100否则换成400
#小于10换成10,大于18换成18
a.clip(10,18)
#赋值为nan(nan为浮点型)
a=a.astype(float) #a原先为整型
a[0,2]=np.nan
数组的拼接
#竖直拼接
np.vstack(x1,x2)#垂直拼接数组
#水平拼接
np.hstack(x1,x2)#横向拼接数组
数组的行列交换
t[[1,2],:] = t[[2,1],:]#行交换
t[:,[1,2]] = t[:,[2,1]]#列交换
初始化数值
#创建全为0数组
np.zeros((3,4))
#创建全为1数
np.ones((3,4))
#10阶方阵 对角线1 其余0
np.eye(10)
# 获取最大值
np.argmax(t,axis=0)#0方向最大值
#最小值
np.argmin(t,axis=0)
生成随机数
copy和view
- a=b完全不复制,a和b相互影响
- a =b[:],视图的操作,一种切片,会创建新的对象a,但是a的数据完全由b保管,他们两个的数据变化是一致的,
- a =b.copy(),完全复制,a和b互不影响
nan和inf
nan:不是一个数
inf:正无穷
-inf:负无穷
nan是float型
nan
1.两个nan是不相等的
2.np.nan !=np.nan
3.利用以上的特性,判断数组中nan的个数
4.由于2,通过np.isnan(a)来判断,返回bool类型比如希望把nan替换为0
5.nan和任何值计算都为nan
常见数值计算函数
有数值t
求和: t.sum(axis=None)
均值: t.mean(a, axis=None)受离群点的影响较大
中值:np.median(t,axis=None)
最大值: t.max(axis=None)
最小值: t.min(axis=None)
极值: np.ptp(t,axis=None)即最大值和最小值只差
标准差: t.std(axis=None)
(axis!=None表示统计全部所得值 axis=1表示轴1上所有数的统计值)