2.科学计算库之Numpy
2017-12-25 本文已影响55人
瓦雷
一、什么是Numpy
numpy主要用来处理同类型数据的多维数组,里面所有的元素必须是同一类型, 如果不是的话,会自动的向下进行转换。在numPy中维度(dimensions)叫做轴(axes),轴的个数叫做秩(rank)。
二、使用
1.基本操作
1.导入numpy库
import numpy as np
2.将list转为ndarray类型
array = np.array([1,2,3,4,5])
print (type(array))
输出为:<class 'numpy.ndarray'>
3.使用array运算+1
array2 = array + 1
print(array2)
输出:[2 3 4 5 6] 所有元素都会做一遍+1运算
4.取值:array2[0]
5.数组各维的大小tuple类型,对一个n行m列的矩阵来说, shape 为 (n,m)
array2.shape()
输出:(5,)
6.每个元素占用的字节数
array.itemsize
7.每个元素的类型,可以是 numpy.int32, numpy.int16, and numpy.float64 等
array.dtype疑问为什么int类型有时候输出32有时候输出64
8.函数生成的数组的元素按照等比数列排布,类似于 range函数
arange(10,30,5)
输出:array([10, 15, 20, 25])
9.array.size: 统计所有元素的个数
10.array.ndim: 数组的维数,也称为rank
11.array.fill(0): 填充矩阵中的值,会将矩阵中的所有值都置为0
12.array.data: 指向数据内存
13.索引与切片:跟Python都是一样的 都是从0开始的
2.数值计算
原始数据:
import numpy as np
tang_array = np.array([[1,2,3],[4,5,6]])
tang_array
输出:
array([[1, 2, 3],
[4, 5, 6]])
1.求和
*所有元素求个
np.sum(tang_array)
*指定要进行的操作是沿着什么轴(维度)
#横向求和
np.sum(tang_array,axis=0)
输出:array([5, 7, 9])
#纵向
np.sum(tang_array,axis=1)
输出:array([ 6, 15])
2.求积
*所有元素求积
tang_array.prod()
*指定要进行的操作是沿着什么轴(维度)
#纵向求积
tang_array.prod(axis = 0)
输出:array([ 4, 10, 18])
#横向
tang_array.prod(axis = 1)
输出:array([ 6, 120])
3.求最小值,使用min()函数
4.求矩阵中所有的元素最小值的索引
array.argmin() 输出:0 该位置就是所有矩阵元素中的最小值索引
横向(x轴)位置最小索引
array.argmin(axis=0)
纵向(y轴)位置最小索引
array.argmin(axis=1)
5.求矩阵中所有的元素的平均值
array.mean()
横向(x轴)位置平均值
array.mean(axis=0)
纵向(y轴)位置平均值
array.mean(axis=1)
6.方差
array.var()
array.clip(2,4):将小于2的值都变成2,大于4的值都变成4
array.round():四舍五入
array.round(decimals=1):指定精度,小数点后几位进行四舍五入
7.标准差
array.std()
array.std(axis = 1)
array.std(axis = 0)
3、排序
1.np.sort(array):默认排序axis = 1
指定排序方向:np.sort(tang_array,axis = 0)
2.np.argsort(array):进行排序之后每个元素应该所处的位置的索引值
3.需求:将3个值有序的插入到list列表中
np.linspace(0,10,10):0-10之间取出相等间隔的10个值
tang_array = np.linspace(0,10,10)
输出:array([ 0. , 1.11111111, 2.22222222, 3.33333333,
4.44444444, 5.55555556, 6.66666667, 7.77777778,
8.88888889, 10. ])
values = np.array([2.5,6.5,9.5])
np.searchsorted(tang_array,values):得到应该插入的索引位置
输出:array([3, 6, 9])
疑问:该怎么插入呢???
4.需求:将矩阵中第一列数据降序排序,第三列一列升序
tang_array = np.array(
[[1,0,6],
[1,7,0],
[2,3,1],
[2,4,0]]
)
得出排序后的索引值:
index = np.lexsort([-1*tang_array[:,0],tang_array[:,2]])
输出:array([3, 1, 2, 0])
tang_array = tang_array[index]
输出:
[[2, 4, 0],
[1, 7, 0],
[2, 3, 1],
[1, 0, 6]]
4、数组形状操作
import numpy as np
tang_array = np.arange(10)
tang_array
输出:array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
tang_array.shape 输出:(10,)
1.tang_array.shape = 2,5:改变数组的形状变成2行5列
输出:array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
或者:tang_array.reshape(1,10)
2.为数据新加一列
tang_array = tang_array[:,np.newaxis]
tang_array.shape
输出:(10,1)
tang_array = tang_array[:,np.newaxis,np.newaxis]
输出:(10, 1, 1, 1)
3.如何去除以上多余的列呢,像1这种没有实际意义的
tang_array = tang_array.squeeze()
tang_array.shape
输出(10,)
4.转制:tang_array.transpose() 行列对调 或者tang_array.T
5.数组的连接
a = np.array([[123,456,678],[3214,456,134]])
b = np.array([[1235,3124,432],[43,13,134]])
c = np.concatenate((a,b))⚠️注意:需要将a,b用扩号包起来,类似元组
输出:array([[ 123, 456, 678],
[3214, 456, 134],
[1235, 3124, 432],
[ 43, 13, 134]])
指定连接:c = np.concatenate((a,b),axis = 1)
输出:array([[ 123, 456, 678, 1235, 3124, 432],
[3214, 456, 134, 43, 13, 134]])
np.vstack((a,b)) = np.concatenate((a,b))默认axis=0
np.hstack((a,b)) = np.concatenate((a,b),axis = 1)
6.对数组进行拉平操作,多行变成一行
a.flatten()
输出:array([ 123, 456, 678, 3214, 456, 134])
或者使用a.ravel()
5、数组生成
1.np.array([1,2,3])
2.np.arange(10):构造从0开始数10个整数,所以是0-9
3.np.arange(2,20,2):构造2-20之间没间隔2构造一个数值,不包括20,取前不取后
输出:array([ 2, 4, 6, 8, 10, 12, 14, 16, 18])
指定类型:np.arange(2,20,2,dtype=np.float32)
4.np.linspace(0,10,5):构造0-10之间等差的5个值,会包含前尾
输出:array([ 0. , 2.5, 5. , 7.5, 10. ])
5.np.logspace(0,1,5):默认是10为底的
输出:array([ 1. , 1.77827941, 3.16227766, 5.62341325, 10. ])
6.构造立体网格
x = np.linspace(-20,-10,5,dtype=np.int32)
y = np.linspace(10,20,5,dtype=np.int32)
x,y= np.meshgrid(x,y)
输出x:
array([[-20, -17, -15, -12, -10],
[-20, -17, -15, -12, -10],
[-20, -17, -15, -12, -10],
[-20, -17, -15, -12, -10],
[-20, -17, -15, -12, -10]], dtype=int32)
输出y:
array([[10, 10, 10, 10, 10],
[12, 12, 12, 12, 12],
[15, 15, 15, 15, 15],
[17, 17, 17, 17, 17],
[20, 20, 20, 20, 20]], dtype=int32)
7.横向量
np.r_[0:10:2]
输出:array([0, 2, 4, 6, 8])
8.列向量
np.c_[0:10:2]
输出:
array([[0],
[2],
[4],
[6],
[8]])
6、常用生成函数
1.构造值为0的数组:np.zeros(3)
输出:array([ 0., 0., 0.])
np.zeros((3,3))
输出:
array([[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.]])
2.构造值为1的数组:np.ones(1)
3.先构造一个空的格式然后填充值
a = np.empty(6)
a.fill(1)
4.构造一个相同的矩阵格式:zeros_like或者ones_like
tang_array = np.array([1,2,3,4])
np.zeros_like(tang_array)
输出:array([0, 0, 0, 0])
np.ones_like(tang_array)
输出:array([1, 1, 1, 1])
5.单位矩阵:只有对角线为1,其他都为0,一个n*n的矩阵
np.identity(5)
输出:
array([[ 1., 0., 0., 0., 0.],
[ 0., 1., 0., 0., 0.],
[ 0., 0., 1., 0., 0.],
[ 0., 0., 0., 1., 0.],
[ 0., 0., 0., 0., 1.]])
7、运算
import numpy as np
x = np.array([5,5])
y = np.array([3,2])
1.np.multiply(x,y):对应位置做乘法运算
输出:array([15, 10])
2、np.dot(x,y):对应位置做乘法运算然后进行想加
3.判断
y = np.array([0,1,1,4])
x = np.array([1,1,1,2])
x == y
输出:array([False, True, True, False], dtype=bool)
与:对应位置比较,如果都为非0则为True,0是False ,1为True
np.logical_and(x,y)
输出:array([False, True, True, True], dtype=bool)
或:np.logical_or(x,y)
输出:array([ True, True, True, True], dtype=bool)
8、随机模块
1.np.random.rand():输出一个随机的0-1的浮点型随机数
或者np.random.random_sample()这种用的少
2.np.random.rand(3,2):指定为3行2列的矩阵维度
输出:
array([[ 0.16911943, 0.29939508],
[ 0.72186879, 0.25800002],
[ 0.01317978, 0.95518917]])
3.np.random.randint(10,size = (5,4)):输出一个0-10(左闭右开),矩阵维度为3行2列
输出:
array([[6, 5, 8, 6],
[0, 4, 8, 0],
[9, 8, 6, 0],
[5, 0, 1, 1],
[2, 0, 6, 4]])
4.np.random.randint(0,10,3):输出一个0-10区间的3个整型随机数
输出:array([5, 8, 9])
5.高斯分布
mu, sigma = 0,0.1
np.random.normal(mu,sigma,10)
输出:
array([-0.06, -0.11, -0.05, 0.12, -0.11, -0.05, 0.09, 0.03, -0.06, 0.03])
6.洗牌:将初始化的数据进行随机打乱
tang_array = np.arange(10)
输出:array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
np.random.shuffle(tang_array)
输出:array([6, 2, 5, 7, 4, 3, 1, 0, 8, 9])
7.随机的种子:指定一种随机的格式
np.random.seed(1):参数随便定义
mu, sigma = 0,0.1
np.random.normal(mu,sigma,10)
输出:array([-0.17, 0.03, 0.12, -0.03, 0.1 , 0.05, 0.02, -0.11, -0.02, 0.03])
⚠️:每次执行随机的操作都会输出同样的结果,也就是第一次随机产生的结果
9、文件读写
1.不使用numpy
文件中写入数据
%%writefile tang.txt
1 2 3 4 5 6
2 3 5 8 7 9
读取:
data = []
with open('tang.txt') as f:
for line in f.readlines():
fileds = line.split()
cur_data = [int(x) for x in fileds]
data.append(cur_data)
data = np.array(data)
data
输出:
array([[1, 2, 3, 4, 5, 6],
[2, 3, 5, 8, 7, 9]])
2.使用numpy
1> data = np.loadtxt('tang.txt'):默认情况下是按照空格进行分割的
如果数据不是按照空格进行分割的情况下应该如下,假如以,分割
data = np.loadtxt('tang2.txt',delimiter = ',')
2> 如果数据如下,表头为字符串类型
%%writefile tang4.txt
e,r,t,y,u,i
1,2,3,4,5,6
但是又不想读取第一行的数据,可以使用skiprows去除第一行
data = np.loadtxt('tang.txt',delimiter = ',',skiprows=1)
3.usecols = (0,1,4) :指定使用哪几列
4.使用numpy写入数据
tang_array = np.array([[1,2,3],[4,5,6]])
np.savetxt('tang4.txt',tang_array)
np.savetxt('tang4.txt',tang_array,fmt='%d'):指定写入数据类型为整型
np.savetxt('tang4.txt',tang_array,fmt='%d',delimiter = ','): 指定写入类型和分割符
np.savetxt('tang4.txt',tang_array,fmt='%.2f',delimiter = ','): 指定浮点的精度
5.读写array结构
1>读写单个array
tang_array = np.array([[1,2,3],[4,5,6]])
np.save('tang_array.npy',tang_array)
tang = np.load('tang_array.npy')
输出:
array([[1, 2, 3],
[4, 5, 6]])
2>读写多个arrar
tang_array2 = np.arange(10)
⚠️是savez函数和npz文件后缀,其实是将两个npy文件压缩成了一个npz文件,可以解压出来查看
#以key value 键值对的形式存储
np.savez('tang.npz',a=tang_array,b=tang_array2)
data = np.load('tang.npz')
#查看所有key
data.keys()
#查看所有value
data.values()
#根据key值查找array的数据
data['a']
输出: array([[1, 2, 3],
[4, 5, 6]])
data['b']
输出:array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])