Numpy

来源:互联网 发布:复古照片相关软件 编辑:程序博客网 时间:2024/06/03 19:58

Numpy(Numerical Python)是一个开源的、高性能的Python数值计算库

为提高运算效率,ndarray数组值的类型默认相同,创建时自动指定默认数据类型(内存占用最大的值类型)
默认浮点类型(float)

这里写图片描述

导包:

import numpy as np


// 创建ndarray数组
可以自定义数据类型

np.array(数组,dtype=np.bool)# 转数组类型数组.astype(np.bool)

这里写图片描述


// 生成特定数组

np.arange()# 等间距生成,10比如1..4...7..10np.linspace(10)# 生成都是1的数组,可传递三维数组,几行几列,具体的个数np.ones()# 生成都是0的数组np.zeros()# 生成自定义模板的数组np.full((3,2),5)      # 三行两列都是5# 创建一个正方的n*n单位矩阵,对角线为1,其余为0np.eye(5)

// 创建随机数组
np.random随机数子库对py内置random进行了补充

# 生成随机数为0-1之间np.random.rand(n)# 正态分布随机数np.random.randn(n)# 整数随机数np.random.randint(low, high, (shape))# 均匀分布的数组,有小数np.random.uniform(low, high, (size))# 从指定正态分布中抽取指定样本,loc为概率分布的均匀值,标准差scalenp.random.normal(loc, scale, (size))# 随机种子,给一个随机数字固定,可以在别的地方用到np.random.seed(s)# 将数组a的第0轴(最外维度)进行随机排列(洗牌),改变数组a,行在变,列不变np.random.shuffle(a)# 同上,不改变数组anp.random.permutation(a)# 从一维数组a中以概率p抽取元素,形成size形状新数组,replace表示是否可以重用元素,默认为False,p为抽取概率,本位置越高,抽取概率越高np.random.choice(a, size=None, replace=False, p=数组a/np.sum(b))

// 索引和切片

# 创建0-23, 共2个三行四列的数组np.arrange(24).reshape((2,3,4))# 一个三维数组,提取的话,python list是a[1][2][3], ndarange是a[1,2,3]# 可以用负数# a[1,:] 选取第一维数组里面所有# a[:,1] 选取所有维度,第一行# a[1,:,3] 选取第一维度数组所有行里的第三个值# a[:,0:2,1:3]# a[:,:,::2]-------------------------------------------------------------------------# 例子,布尔型索引names = np.array(['Bob','Joe','Will','Bob','Will','Joe','Joe'])data = np.arange(28).reshape(7,4)names[names == 'Bob']# array(['Bob', 'Bob'], dtype='<U4')names == 'Bob'# array([ True, False, False,  True, False, False, False], dtype=bool)# 姓名数组可以跟数字数字一一对应data[names == 'Bob']# array([[ 0,  1,  2,  3],#        [12, 13, 14, 15]])# 可以将布尔型数组跟切片、整数、整数序列混合使用data[names == 'Bob',2:]# array([[ 2,  3],#        [14, 15]])# 组合多个布尔型索引,进行逻辑运算# 组合条件,逻辑运算符:& 且,| 或,非(!= 或 ~)# 并集,交集(names == 'Bob') | (names == 'Will')# array([ True, False,  True,  True,  True, False, False], dtype=bool)# 且,没有交集(names == 'Bob') & (names == 'Will')# array([False, False, False, False, False, False, False], dtype=bool)--------------------------------------------------------------------------// 数组修改a[:,0:2] = 1                   # 切片批量修改a[:,0:2] = [[11,12],[13,14]]   # 切片批量修改names[names == 'Bob'] = 'aaa'  # 修改单个a为数组,a > 1 返回为true的索引np.where(a > 2) # 返回索引# (array([0, 0], dtype=int64),#  array([0, 1], dtype=int64),#  array([1, 0], dtype=int64))# 也可以用作三元表达式,满足条件,返回x,不满足返回ynp.where(条件,x, y)

// 维度变换

# 修改维度,但不改原值.reshape(shape)# 同上,但修改原值.resize(shape)# 降维度,把多维变成一维数组,不改变原值.flatten()

// Numpy统计
axis=1 行
axis=0 列

.sum(a,axis=None)                   # 求和.sort_values('字段', ascending=False)# 排序,升序排列.mean(a,axis=None)                  # 平均数.average(a,axis=None,weights=None)  # 加权平均,weights加权值,不设为等权重,例子[10, 5, 1],每列分别X10,X5,X1在/(10+5+1).var(a,axis=None)                   # 方差:各数与平均数之差的平方的平均数.std(a,axis=None)                   # 标准差:方差平方根.min(a,axis=None)                   # 最小值.max(a,axis=None)                   # 最大值.argmin(a,axis=None).argmax(a,axis=None)                # 求数组降维度以后最大值的下标.median(a,axis=None)                # 中位数.ptp(a,axis=None)                   # 元素最大值与最小值的差.cumsum()                           # 累加,cumsum和cumprod之类的方法不聚合,产生一个中间结果组成的数组,默认一维数组,1为按原样.cumprod()                          # 累乘np.count_nonzero(arr > 0)           # 计数非0值个数,布尔值会被强制转换为1和0,可以使用sum()对布尔型数组中的True值计数.bools.any()                            # 测试数组中是否存在一个或多个True.bools.all()                        # 数组中所有值是否都是True, 测试有没有空值.round(,0)                          # 把小数强制转换成0import pandas as pds = pd.Series(np.random.randint(0, 7, size=10))  # 统计出现的个数,左边是下标,右边是出场的次数s.value_counts()                    # 统计个数

// Numpy数据存取

  • numpy提供了便捷的内部文件存取,将数据存为np专用的npy(二进制格式)或npz(压缩打包格式)格式
  • npy格式以二进制存储数据的,在二进制文件第一行以文本形式保存了数据的元信息(维度,数据类型),可以用二进制工具查看查看内容
  • npz文件以压缩打包文件存储,可以用压缩软件解压
a = np.array([['张三','李四','王五','赵六'],['11','12','13','14','15']])b = np.arange(24).reshape((2,3,4))np.save('a.npy',a)                      # 存为.npy文件np.savez("a.npz", ar0 = a, ar1 = b)     # 多个数组存入一个.npz压缩包c = np.load('x.npy')                    # .npy文件读入数组d = np.load("y.npz")                    # .npz压缩包读入#d["ar0"]                               # 单独输出数组

// Numpy存储CSV文件

# 存储csv文件,本身是ASCII字符,不能存储非ASCII字符串,csv文件只能存储一维、二维数据,不能存储多维数据np.savetxt(frame,array,fmt='%.18e',delimiter=None)

这里写图片描述

// 读取csv文件

# 读取csv文件np.loadtxt(frame,dtype=np.float,delimiter=None,skiprows=0,usecols=None,unpack=False)# 去掉b'0.00'中的bnp.loadtxt('a.csv', dtype=bytes, delimiter=',').astype(str)

这里写图片描述


// ndarray-数组操作

# axis=0行 1列np.sort(a,axis=None)                # 从小到大-np.sort(-a, axis=None)             # 从大到小# 数组转置,把每一列抽出来,在横着放进去a.T# ndarray转为python list,用于和Python原生结合编写程序.tolist()# 数组去重,把重复去掉,并且按从小到大生成一个新的数组.unique(a)

// 数组拼接(数组合并)
ndarray是保存在内存中的一段连续值,增加值操作会重新分配内存,一般不推荐,可以用合并数组的方式模拟增加值

将两个或多个数组合并成一个新数组

# 数组合并, 如果数组不对应,需要先转置,在axis=1进行拼接np.concatenate((a1,a2,...), axis=0)

// 数组删除
删除操作不能精确选取元素,常被索引和切片查询赋值新变量代替

np.delete(arr, obj, axis=None)# 删除多列,会把没有被选中的其他值也删掉,有损失b3 = np.delete(a, [1,2], axis=1)

// Numpy-数据运算
矢量化运算也叫向量化运算,

  • 标量:一个数值
  • 广播机制:自动补齐,数组与标量之间的运算作用于数组的每一个元素
# 三维数组除以标量运算,列表中每一个值都会返回# 两个不同维度进行计算,维度小的会变成大的维度在进行运算,然后每个值单独做计算a/a.mean()

这里写图片描述


这里写图片描述


// Numpy矩阵运算

  • NumPy有两种不同的数据类型:数组ndarray和矩阵matrix
  • matrix是array的分支,用于矩阵计算
# 转换成矩阵对象m = np.matrix(x)# 每个数值+5m + 5 # 有复杂的运算体系,但不是相加那么简单m * 5
原创粉丝点击