一. Numpy与Python的比较
- Numpy的操作单位是向量和矩阵
- Numpy底层是C写的,会更加高效
- Numpy数组内的数据类型必须是统一的,需要连续存储在内存中,访问更加高效
Numpy与Python速度比较
#将100万个数乘以2
#Python方法
def computer_twice(values):
res = []
for i in values:
res.append(i**2)
return res
values = list(range(1,1000001))
#286 ms ± 48.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit computer_twice(values)
#%timeit:魔术方法,多次运行求运行时间的平均值
%timeit values*2
#24.4 ms ± 5.41 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
Numpy速度比之Python快了非常多
二. 数组的创建
2.1 array函数
import numpy as np
x = np.array([1,2,3,4,5])
x.shape #返回一个元组
x.ndim #数组维度
x = np.array([1,2,3,4,5],ndmin=2)
#维度改为2
2.2 数组的数据类型
#数据中只要有一个元素是浮点数,
#返回的数组中所有元素都将是浮点数
data = [1.0,2,3,4]
data = np.array(data)
data.dtype #dtype('float64')
np.sctypes#所有数据类型一览表
x = [1,2,3,4]
y = np.array(x,dtype=np.int64)#默认是int32
y.dtype
定义数据类型的方法:
y.astype(np.float32)
np.array(y,dtype=np.float32)
np.float32(y)
2.3 创建值为1 0的数组
np.ones((2,3)) #创建指定形状数值为1的数组
np.full((2,3),-1) #创建元素为固定数值的数组
np.empty((2,3)) #直接使用保存在内存块中的值作为数组的元素
np.eye(3) #创建一个3*3的单位矩阵
array.fill(ele) #将数组中所有元素变更为指定的值,会修改原数组
x = np.arange(9).reshape(3,3)
y = np.zeros_like(x)
z = np.ones_like(x)
2.4 创建单位矩阵 对角矩阵 三角矩阵
np.identity(3) #创建单位矩阵
#常用的对角矩阵可以用diag函数和diagflat函数来创建
#需要指定对角元素的列表和数组
#k参数调整对角元素排列的位置,为正则上升,负则下降
np.diag([1,2,4],k=1)
np.tri(3) #创建下三角函数
x = np.array([[2,-3],[3,4]])
np.tril(x) #对角线上方元素设置为0
np.triu(x) #对角线下方元素设置为0
2.5 数组值等间距变化的数组
import numpy as np
#可以用arange函数或者linspace函数创建
#arange(start,end,step)在[start,end)之间创建数组
#start默认为0,step默认为1
np.arange(1,10,2)
#linspace(start,end,num)指定区间[start,end]内指定元素的个数,end默认包含在内
endpoint=False 则不会包含stop的值
np.linspace(0,1,5)
#默认是以10为底 可以用base=num修改
np.logspace(0,5,6,base=np.e)
2.6 随机数组的创建
np.random.normal(0,1,(3,3)) #创建一个3*3,均值为0标准差为1的正态分布随机数构成的数组
np.random.randint(0,10,(3,3))
#创建一个3*3,在[0,10)之间随机整数构成的数组
np.random.permutation(array) #根据原数组生产新列表
np.random.shuffle(array) #修改原列表
np.random.choice(array,size=(3,3)) #
三. 元素的访问
3.1 索引和切片
x = np.arange(1,10).reshape(3,3)
x[1,1] #逗号隔开各个维度
#切片返回一整行/列,返回的是一维数组
x[:,2]
3.2 视图与副本
与原有数组共享内存的数组称为视图
x = np.arange(1,10)
y = x.reshape(3,3) #y就是x的视图
y = x.copy() #y是x的一个副本
3.3 花式索引
3.3.1 一维数组
x = np.arange(10)
ind = [1,3,5]
x[ind]
#结果的形状与索引数组ind一样
ind = np.array([[0,1],[1,0]])
x[ind]
3.3.2 多维数组
x = np.arange(12).reshape(3,4)
row = np.array([0,1,2])
col = np.array([1,2,3])
x[row,col] #(0,1) (1,2) (2,3)
3.4 使用布尔数组进行索引
- 这种索引方式需要使用元素是布尔值的数组或列表
- 使用元素为True的位置上的元素组成新的数组
- 使用比较运算符,就可以创建将数组中的各个元素与数值进行比较得到的布尔值组成的数组
x = np.array([1,2,3,4,5])
x[x>3]
a = np.array([[1 , 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
b = np.nonzero(a % 2 == 0)#横坐标为一个一维数组,纵坐标为一个一维数组
a[list(zip(b[0], b[1]))[0]]
四. 数组形状和大小的变更
4.1 形状的变更
array.flatten() #返回的是转为向量的副本
array.ravel() #返回的是转为向量的视图
#reshape是对数组形状进行变更
x = np.array([[0,1],[2,3]])
y = x.reshape(4)
#使用newaxis在需要追加维度的地方操作
y = np.array([1,2,3,4])
y[:,np.newaxis]#(4,1)
y[np.newaxis,:]#(1,4)
#np.expand_dims(y,axis=1)#表示列上增加维度从4列向量-->(4,1)
#np.expand_dims(y,axis=0)#(1,4)
4.2 数组的合并
x = np.arange(12).reshape(3,4)
y = np.arange(12).reshape(3,4)
c = np.vstack([x,y]) #(6,4)
np.r_[x,y]
e = np.concatenate([x,y],axis=0) #(6,4)
d = np.hstack([x,y]) #(3,8)
np.c_[x,y]
f = np.concatenate([x,y],axis=1) #(3,8)
#可见以上的拼接不会增加维度
a = np.stack([x,y],axis = 0) #(2,3,4)
b = np.stack([x,y],axis = 1) #(3,2,4)
4.3 重复模式的数组
x = np.arange(12).reshape(3,4)
#类似于循环形式
np.tile(x,(2,3)) #(6,12)
np.tile(x,(3,2)) #(9,8)
#针对元素进行反复填充
np.repeat(x,3,axis=0) #(9,8)
np.repeat(x,3,axis=1) #(3,12)
4.4 坐标轴的切换
x = np.arange(12).reshape(3,4)
#转置出的都是视图
y = x.T
y = np.transpose(x)
y = x.swapaxes(0,1)
反转轴
arr_2d = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
reversed_arr = np.flip(arr_2d)
reversed_arr_rows = np.flip(arr_2d, axis=0)#反转行
reversed_arr_columns = np.flip(arr_2d, axis=1)#反转列
arr_2d[1] = np.flip(arr_2d[1])#反转特定的行
arr_2d[:,1] = np.flip(arr_2d[:,1])#反转特定的列
在指定位置插入新轴
a = np.array([1, 2, 3, 4, 5, 6])
b = np.expand_dims(a, axis=1)
c = np.expand_dims(a, axis=0)
五. 数组的基本运算
5.1 基本的算术运算
广播
对两个不同形状的数组进行计算时,
需要将形状较小的数组拓展到与形状较大的数组相同的大小后再进行计算
x = np.array([0,0])
y = np.array([[1],[1]]) # [[1,1],[1,1]]
5.2 通用函数
np.sin(array)
np.deg2rad() #度转为弧度
np.log()
np.sqrt()
np.exp()
np.abs()
np.rint()
np.sort(seq) #产生新的排序数组
array.sort() #排序后的数组替换原数组
np.argsort(array) #获得排序索引
np.median() #中位数
np.mean() #均值 array.mean()
np.var() #方差 array.var()
np.std() #标准差 array.std()
#numoy数组的分裂
np.split(x,[1,3],axis=1)#axis默认是0 #第二个参数如果是数字表示分类几分;列表表示分类索引节点
5.3 比较运算
#算术运算中True和False作为1和0处理
np.all() #数组中元素全部为True才返回True
np.any() #数组中只要有一个True就会返回True
5.4 向量和矩阵乘积
x*y #不是矩阵相乘,是元素对应位置相乘
#不要将向量参与运算
array1 @ array2
np.dot(array1,array2)
六. Numpy读写csv文件
#读文件
arr = np.loadtxt(r'data1.csv',encoding='utf-8'
,delimiter=' '#分隔符
,dtype=int #指定类型
,usecols=(1,2) #指定选取的列
,unpack=True #是否把列作为单独的数组
)
#写文件
arr1 = np.arange(12).reshape(3,4)
np.savetxt(r'data2.csv'
,arr1
,encoding='utf-8'
,delimiter=' ' #分隔符
,header='x y z q' #标题行
)