盘一盘 Python 系列 2 - NumPy (下)(二)

简介: 盘一盘 Python 系列 2 - NumPy (下)(二)

本文首发于“生信补给站”公众号 https://mp.weixin.qq.com/s/0-9zUTxZC6qefyjLyw1SSA



分裂


使用「分裂」函数有两种选择


  1. 有通用的 split
  2. 有专门的 hsplit, vsplit


用下面数组来举例:



arr = np.arange(25).reshape((5,5))print( arr )
[[ 0 1 2 3 4]
 [ 5 6 7 8 9]
 [10 11 12 13 14]
 [15 16 17 18 19]
 [20 21 22 23 24]]


split

concatenate() 函数一样,我们可以在 split() 函数里通过设定轴,来对数组沿着竖直方向分裂 (轴 0) 和沿着水平方向分裂 (轴 1)。


first, second, third = np.split(arr,[1,3])print( 'The first split is', first )print( 'The second split is', second )print( 'The third split is', third )
The first split is [[0 1 2 3 4]]
The second split is [[ 5 6 7 8 9]
[10 11 12 13 14]]
The third split is [[15 16 17 18 19]
[20 21 22 23 24]]


split() 默认沿着轴 0 分裂,其第二个参数 [1, 3] 相当于是个切片操作,将数组分成三部分:


  • 第一部分 - :1 (即第 1 行)
  • 第二部分 - 1:3 (即第 2 到 3 行)
  • 第二部分 - 3:  (即第 4 到 5 行)


hsplit, vsplit

vsplit()split(axis=0) 等价,hsplit()split(axis=1) 等价。一图胜千言:



为了和上面不重复,我们只看 hsplit。


first, second, third = np.hsplit(arr,[1,3])print( 'The first split is', first )print( 'The second split is', second )print( 'The third split is', third )
The first split is [[ 0]
                    [ 5]
                    [10]
                    [15]
                    [20]]
The second split is [[ 1 2]
                     [ 6 7]
                     [11 12]
                     [16 17]
                     [21 22]]
The third split is [[ 3 4]
                    [ 8 9]
                    [13 14]
                    [18 19]
                    [23 24]]



4.3 重复和拼接



重复 (repeat) 和拼接 (tile) 这两个操作本质都是复制


  • 重复是在元素层面复制
  • 拼接是在数组层面复制



重复


函数 repeat() 复制的是数组的每一个元素,参数有几种设定方法:


  • 一维数组:用标量和列表来复制元素的个数
  • 多维数组:用标量和列表来复制元素的个数,用轴来控制复制的行和列

标量



arr = np.arange(3)print( arr )print( arr.repeat(3) )
[0 1 2]
[0 0 0 1 1 1 2 2 2]


标量参数 3 - 数组 arr 中每个元素复制 3 遍。


列表


print( arr.repeat([2,3,4]) )
[0 0 1 1 1 2 2 2 2]


列表参数 [2,3,4] - 数组 arr 中每个元素分别复制 2, 3, 4 遍。


标量和轴



arr2d = np.arange(6).reshape((2,3))print( arr2d )print( arr2d.repeat(2, axis=0) )
[[0 1 2]
 [3 4 5]]
[[0 1 2]
 [0 1 2]
 [3 4 5]
[3 4 5]]


标量参数 2 和轴 0 - 数组 arr2d 中每个元素沿着轴 0 复制 2 遍。


列表和轴


print( arr2d.repeat([2,3,4], axis=1) )
[[0 0 1 1 1 2 2 2 2]
 [3 3 4 4 4 5 5 5 5]]


列表参数 [2,3,4] 和轴 1 - 数组 arr2d 中每个元素沿着轴 1 分别复制 2, 3, 4 遍。


拼接


函数 tile() 复制的是数组本身,参数有几种设定方法:


  • 标量:把数组当成一个元素,一列一列复制
  • 形状:把数组当成一个元素,按形状复制


标量


arr2d = np.arange(6).reshape((2,3))print( arr2d )print( np.tile(arr2d,2) )
[[0 1 2]
 [3 4 5]]
[[0 1 2 0 1 2]
 [3 4 5 3 4 5]]


标量参数 2 - 数组 arr 按列复制 2 遍。


形状


print( np.tile(arr2d, (2,3)) )
[[0 1 2 0 1 2 0 1 2]
 [3 4 5 3 4 5 3 4 5]
 [0 1 2 0 1 2 0 1 2]
 [3 4 5 3 4 5 3 4 5]]


标量参数 (2,3) - 数组 arr 按形状复制 6 (2×3) 遍,并以 (2,3) 的形式展现。



4.4 其他操作



本节讨论数组的其他操作,包括排序 (sort),插入 (insert),删除 (delete) 和复制 (copy)。



排序


排序包括直接排序 (direct sort) 和间接排序 (indirect sort)。


直接排序


arr = np.array([5,3,2,6,1,4])print( 'Before sorting', arr )arr.sort()print( 'After sorting', arr )
Before sorting [5 3 2 6 1 4]
After sorting [1 2 3 4 5 6]


sort()函数是按升序 (ascending order) 排列的,该函数里没有参数可以控制 order,因此你想要按降序排列的数组,只需


print( arr[::-1] )
[6 5 4 3 2 1]


现在让人困惑的地方来了。



知识点

用来排序 numpy 用两种方式:


  1. arr.sort()
  2. np.sort( arr )




第一种 sort 会改变 arr,第二种 sort 在排序时创建了 arr 的一个复制品,不会改变 arr。看下面代码,用一个形状是 (3, 4) 的「二维随机整数」数组来举例,用整数是为了便于读者好观察排序前后的变化:



arr = np.random.randint( 40, size=(3,4) )print( arr )


[[24 32 23 30]
 [26 27 28 0]
 [ 9 14 24 13]]



第一种 arr.sort(),对第一列排序,发现 arr 的元素改变了。



arr[:, 0].sort() print( arr )
[[ 9 32 23 30]
 [24 27 28 0]
 [26 14 24 13]]



第二种 np.sort(arr),对第二列排序,但是 arr 的元素


np.sort(arr[:,1])


array([ 14, 27, 32])

print( arr )
[[ 9 32 23 30]
 [24 27 28 0]
 [26 14 24 13]]





此外也可以在不同的轴上排序,对于二维数组,在「轴 0」上排序是「跨行」排序,在「轴 1」上排序是「跨列」排序。



arr.sort(axis=1)print( arr )
[[ 9 23 30 32]
 [ 0 24 27 28]
 [13 14 24 26]]


间接排序

有时候我们不仅仅只想排序数组,还想在排序过程中提取每个元素在原数组对应的索引(index),这时 argsort() 就派上用场了。以排列下面五个学生的数学分数为例:




score = np.array([100, 60, 99, 80, 91])idx = score.argsort()print( idx )
[1 3 4 2 0]


这个 idx = [1 3 4 2 0] 怎么理解呢?很简单,排序完之后分数应该是 [60 80 91 99 100],


  • 60,即 score[1] 排在第0位, 因此 idx[0] =1
  • 80,即 score[3] 排在第1 位, 因此 idx[1] =3
  • 91,即 score[4] 排在第2 位, 因此 idx[2] =4
  • 99,即 score[2] 排在第3 位, 因此 idx[3] =2
  • 100,即 score[0] 排在第4 位, 因此 idx[4] =0


用这个 idx 对 score 做一个「花式索引」得到 (还记得上贴的内容吗?)


print( score[idx] )
[ 60 80 91 99 100]



再看一个二维数组的例子。



arr = np.random.randint( 40, size=(3,4) )print( arr )
[[24 32 23 30]
 [26 27 28 0]
 [ 9 14 24 13]]


对其第一行 arr[0] 排序,获取索引,在应用到所用行上。


arr[:, arr[0].argsort()]
array([[23, 24, 30, 32],
       [28, 26, 0, 27],
       [24, 9, 13, 14]])


这不就是「花式索引」吗?来我们分解一下以上代码,先看看索引。


print( arr[0].argsort() )
[2, 0, 3, 1]


「花式索引」来了,结果和上面一样的。


arr[:, [2, 0, 3, 1]]
array([[23, 24, 30, 32],
       [28, 26, 0, 27],
       [24, 9, 13, 14]])




插入和删除


和列表一样,我们可以给 numpy 数组


  • insert()函数在某个特定位置之前插入元素
  • delete()函数删除某些特定元素


a = np.arange(6)print( a )print( np.insert(a, 1, 100) )print( np.delete(a, [1,3]) )
[0 1 2 3 4 5]
[ 0 100 1 2 3 4 5]
[0 2 4 5]



复制


copy()函数来复制数组 a 得到 a_copy,很明显,改变 a_copy 里面的元素不会改变 a。


a = np.arange(6)a_copy = a.copy()print( 'Before changing value, a is', a )print( 'Before changing value, a_copy is', a_copy )a_copy[-1] = 99print( 'After changing value, a_copy is', a_copy )print( 'After changing value, a is', a )
Before changing value, a is [0 1 2 3 4 5]
Before changing value, a_copy is [0 1 2 3 4 5]
After changing value, a_copy is [ 0 1 2 3 4 99]
After changing value, a is [0 1 2 3 4 5]
相关文章
|
2月前
|
存储 Java 数据处理
(numpy)Python做数据处理必备框架!(一):认识numpy;从概念层面开始学习ndarray数组:形状、数组转置、数值范围、矩阵...
Numpy是什么? numpy是Python中科学计算的基础包。 它是一个Python库,提供多维数组对象、各种派生对象(例如掩码数组和矩阵)以及用于对数组进行快速操作的各种方法,包括数学、逻辑、形状操作、排序、选择、I/0 、离散傅里叶变换、基本线性代数、基本统计运算、随机模拟等等。 Numpy能做什么? numpy的部分功能如下: ndarray,一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组 用于对整组数据进行快速运算的标准数学函数(无需编写循环)。 用于读写磁盘数据的工具以及用于操作内存映射文件的工具。 线性代数、随机数生成以及傅里叶变换功能。 用于集成由C、C++
344 0
|
2月前
|
Java 数据处理 索引
(numpy)Python做数据处理必备框架!(二):ndarray切片的使用与运算;常见的ndarray函数:平方根、正余弦、自然对数、指数、幂等运算;统计函数:方差、均值、极差;比较函数...
ndarray切片 索引从0开始 索引/切片类型 描述/用法 基本索引 通过整数索引直接访问元素。 行/列切片 使用冒号:切片语法选择行或列的子集 连续切片 从起始索引到结束索引按步长切片 使用slice函数 通过slice(start,stop,strp)定义切片规则 布尔索引 通过布尔条件筛选满足条件的元素。支持逻辑运算符 &、|。
183 0
|
4月前
|
机器学习/深度学习 API 异构计算
JAX快速上手:从NumPy到GPU加速的Python高性能计算库入门教程
JAX是Google开发的高性能数值计算库,旨在解决NumPy在现代计算需求下的局限性。它不仅兼容NumPy的API,还引入了自动微分、GPU/TPU加速和即时编译(JIT)等关键功能,显著提升了计算效率。JAX适用于机器学习、科学模拟等需要大规模计算和梯度优化的场景,为Python在高性能计算领域开辟了新路径。
411 0
JAX快速上手:从NumPy到GPU加速的Python高性能计算库入门教程
|
4月前
|
存储 数据采集 数据处理
Pandas与NumPy:Python数据处理的双剑合璧
Pandas与NumPy是Python数据科学的核心工具。NumPy以高效的多维数组支持数值计算,适用于大规模矩阵运算;Pandas则提供灵活的DataFrame结构,擅长处理表格型数据与缺失值。二者在性能与功能上各具优势,协同构建现代数据分析的技术基石。
399 0
|
机器学习/深度学习 数据采集 数据挖掘
解锁 Python 数据分析新境界:Pandas 与 NumPy 高级技巧深度剖析
Pandas 和 NumPy 是 Python 中不可或缺的数据处理和分析工具。本文通过实际案例深入剖析了 Pandas 的数据清洗、NumPy 的数组运算、结合两者进行数据分析和特征工程,以及 Pandas 的时间序列处理功能。这些高级技巧能够帮助我们更高效、准确地处理和分析数据,为决策提供支持。
293 2
|
数据采集 数据可视化 数据处理
如何使用Python实现一个交易策略。主要步骤包括:导入所需库(如`pandas`、`numpy`、`matplotlib`)
本文介绍了如何使用Python实现一个交易策略。主要步骤包括:导入所需库(如`pandas`、`numpy`、`matplotlib`),加载历史数据,计算均线和其他技术指标,实现交易逻辑,记录和可视化交易结果。示例代码展示了如何根据均线交叉和价格条件进行开仓、止损和止盈操作。实际应用时需注意数据质量、交易成本和风险管理。
699 5
|
存储 数据处理 Python
Python科学计算:NumPy与SciPy的高效数据处理与分析
【10月更文挑战第27天】在科学计算和数据分析领域,Python凭借简洁的语法和强大的库支持广受欢迎。NumPy和SciPy作为Python科学计算的两大基石,提供了高效的数据处理和分析工具。NumPy的核心功能是N维数组对象(ndarray),支持高效的大型数据集操作;SciPy则在此基础上提供了线性代数、信号处理、优化和统计分析等多种科学计算工具。结合使用NumPy和SciPy,可以显著提升数据处理和分析的效率,使Python成为科学计算和数据分析的首选语言。
319 3
|
存储 机器学习/深度学习 算法
Python科学计算:NumPy与SciPy的高效数据处理与分析
【10月更文挑战第26天】NumPy和SciPy是Python科学计算领域的两大核心库。NumPy提供高效的多维数组对象和丰富的数学函数,而SciPy则在此基础上提供了更多高级的科学计算功能,如数值积分、优化和统计等。两者结合使Python在科学计算中具有极高的效率和广泛的应用。
434 2
|
机器学习/深度学习 数据处理 Python
从NumPy到Pandas:轻松转换Python数值库与数据处理利器
从NumPy到Pandas:轻松转换Python数值库与数据处理利器
335 1
|
机器学习/深度学习 数据处理 计算机视觉
NumPy实践宝典:Python高手教你如何轻松玩转数据处理!
【8月更文挑战第22天】NumPy是Python科学计算的核心库,专长于大型数组与矩阵运算,并提供了丰富的数学函数。首先需安装NumPy (`pip install numpy`)。之后可通过创建数组、索引与切片、执行数学与逻辑运算、变换数组形状及类型、计算统计量和进行矩阵运算等操作来实践学习。NumPy的应用范围广泛,从基础的数据处理到图像处理都能胜任,是数据科学领域的必备工具。
192 0

推荐镜像

更多