你好,我是kelly,今天分享:工作中常用的Numpy操作。
Numpy是Python的一个专注于数值运算的第三方扩展包,提供了丰富的数组操作、线性代数、傅立叶变换和随机数等功能。
几乎是数据挖掘、机器学习、深度学习等方向的必备技能。
这篇文章不展示运行结果,直接展示用法,纯干货,侧重方法总结。
导入方式:
import numpy as np
一、创建数组
1、一维数组
# 从Python列表创建数组
np.array([1, 2, 3, 4, 5])
# 创建长度为5的NumPy数组,所有元素都为0
np.zeros((5))
# 创建一个随机值数组
np.random.random((5))
# 给定一个步长,创建一个等差数列性质的数组
np.arange(5)
# 在给定范围内,创建指定元素数目、等间隔的数组
np.linspace(0, 2*np.pi, 5)
# 在一个范围内生成n个随机整数样本
np.random.randint(5,10,10)
# 在指定的区间内生成基于对数的等比数组
np.logspace(1, 10,num=20)
2、二维数组
# 创建二维数组
np.zeros((2, 3))
# 一维转为二维
np.arange(20).reshape(4,5)
# 同理,创建三维数组
np.arange(27).reshape(3,3,3)
# 创建全1的数组
np.ones((1,2))
# 创建常数数组
np.full((2,2), 7)
# 对称数组
np.eye(2)
# 创建随机数组
a = np.random.random((2,2))
# 创建和指定的数组相同shape的数组
np.empty_like(a)
二、数组属性(对于单个数组而言)
# 数组元素的类型
a.dtype
# 数组元素数目
a.size
# 数组的形状
a.shape
# 单个数组元素所占用的字节数目
a.itemsize
# 数组的维度
a.ndim
# 数组数据所有数据都占用的字节数(不仅仅是数组元素本身占用字节)
a.nbytes
三、数组的常用函数
a = np.arange(10)
a.sum()
a.min()
a.max()
a.cumsum())
# 计算每一列的和
np.sum(x, axis=0)
# 计算每一行的和
np.sum(x, axis=1)
# 数学函数
# 三角函数
np.sin
# 平均舍入到给定的小数位数
np.around
# 数组各个元素的下限,向下取整
np.floor
# 数组各个元素的上限,向上取整
np.ceil
# 指数和对数
np.exp
# 自然对数
np.log
# 以10为底的对数,
np.log10
# 取幂之和的对数
np.logaddexp
# 矩阵对应元素相乘
np.multiply
# 根据最小、最大,对数组截断
np.clip(a, a_min=0, a_max=2)
# 逐元素的非负平方根
np.sqrt
# 逐元素最大值
np.maximum
# 数组元素的按元素最小值
np.minimum
# 沿着指定的轴,计算任意百分比下的分位数
np.percentile(a,q=0.25,axis=0)
# 计算中位数、平均值、加权平均值
np.median()
np.mean()
np.average()
# 数组的方差、标准差
np.var()
np.std()
# 计算矩阵的行列式
np.linalg.det()
# 查找并返回非零元素的所有下标。
np.argwhere(a)
# 统计所有非零元素的数目
np.count_nonzero
# 沿着指定维度,返回数组中最大元素的索引
np.argmax(a, axis=0)
np.argmin(a, axis=0)
四、数组shape改变相关函数(对于单个数组而言)
# shape的改变
a = np.arange(25)
a = a.reshape((5, 5))
# 拉直数组,返回一维度数组
a.flatten()
# 将多维数组的元素,展开为一维数组
a.ravel()
# 数组转置
np.transpose(a)
# 数据滚动
np.rollaxis(a,axis=1)
# 沿着执行维度增加维度
np.expand_dims(a, axis=0)
# 移除指定维度,降低数组的维度
np.squeeze(a, axis=None)
# 沿着水平方向,将数组分割为多个相等的部分
np.hsplit(a, 2)
# 沿着垂直方向,将数组分割为多个相等的部分
np.vsplit(a, 2)
# 重复数组中的元素n次。
np.repeat(a, 2, axis=0)
# 重复一个数组N次来生成另一个数组
a = np.random.random((1, 3))
np.tile(a, 3)
np.tile(a, [3, 1])
五、数组的索引与切片
1、一维度数组
a = np.array([1, 2, 3])
# 索取单个元素
a[0]
# 花式索引
# 使用索引序列对数组进行索引
a = np.arange(0, 300, 20)
indices = [0, 6, -2]
b = a[indices]
# 布尔屏蔽
# 根据条件检索数组元素
a = np.linspace(0, 5 * np.pi, 30)
mask = np.sin(a) >= 2
a[mask]
# 缺省索引
a = np.arange(0, 50, 10)
a[:6]
a[a >=20]
# where函数
# 返回使得条件为真的元素
a = np.arange(0, 50, 20)
np.where(a < 16)
2、多维数组
a = np.random.random((2,2))
# 提取第二列(索引1)的所有元素
my_array[:, 1]
# 选择数组的前2行和第1、第二列
a[:2, 1:3]
# 整数数组索引
a = np.array([[1,2], [3, 4], [5, 6]])
a[[0, 1, 2], [0, 1, 0]]
# 高级切片
# 基于省略号...的切片方式。如果行位置使用省略号,代表选择所有行;如果列位置使用省略号,则选择全部列
# 保留全部行,选择第3列以后的列
a[...,2:]
# 保留第1行之后的行,保留所有列
a[1:,...]
六、数组之间的运算
a = np.array([[1.0, 2.0], [3.0, 4.0]])
b = np.array([[5.0, 6.0], [7.0, 8.0]])
sum = a + b
difference = a - b
# 乘法和除法运算符执行逐元素乘法
product = a * b
quotient = a / b
# 广播(Broadcasting),允许numpy在执行算术运算时使用不同形状的数组
a = np.random.random((3, 5))
b = np.random.random((3,))
# 将b加到a的每一行,广播机制
c = a + b
# 水平方向叠加多个数组
a = np.random.random((3,))
b = np.random.random((3,))
np.hstack((a,b))
# 垂直方向叠加多个数组
np.vstack((a,b))
# 矩阵乘法
matrix_product = a.dot(b)
# 矩阵乘积,矩阵维度必须相匹配
np.matmul(a, b)
# 通过符号来表示矩阵运算
a = np.arange(0, 6).reshape(2, 3)
b = np.arange(0, 9).reshape(3, 3)
np.einsum('ji',a)
np.einsum('ij,jk',a,b)
说明:下面三种用法等价:
np.einsum('ij,jk',a,b)
np.matmul(a, b)
a @ b
本文原始版本发表链接:
kelly会在公众号「kelly学技术」不定期更新Python、机器学习、深度学习等文章,感兴趣的朋友可以关注一下,期待与您交流。