- 博客(155)
- 收藏
- 关注
原创 「Python数据科学」NumPy多维数组的保存与加载
本文介介绍了将NumPy中的多维数组进行保存和加载的方法,我们可以通过pickle进行保存和修改,也可以通过np.save()和np.load()进行保存和修改。需要保存为文本格式,可以使用np.savetxt()和np.loadtxt()。保存多个数组,可以使用np.savez()。数据量比较大时,可以考虑HDF5文件。
2025-01-03 12:30:00
406
原创 「Python数据科学」利用NumPy通用函数ufunc进行面向数组编程
本文首先简单回顾了ndarray、向量化、广播的相关内容。然后,介绍了基于NumPy中的核心特性:ndarray、向量化、广播,以及ufunc实现面向数组编程的方法。最后介绍了内置ufunc的使用,以及如何自定义ufunc的3种方法。
2025-01-03 08:19:00
734
原创 「Python数据科学」一文搞定NumPy中常用的数组拼接与切分方法
本文简单介绍了NumPy中相对常用的数组拼接和拆分的函数,最灵活常用的就是np.concatenate()函数了,当然,如果是进行二维数组的数据的拼接,np.vstack()和np.hstack()也是挺常用的。在进行数组拆分和拼接操作时,只要对轴的概念比较理解,一般都不会有太大的问题。
2024-12-25 16:41:50
573
原创 「Python数据科学」标量、向量、矩阵、张量与多维数组的辨析
本文简单辨析了标量、向量、矩阵和张量这几个术语的含义,标量、向量和矩阵可以看作是特殊的张量。所有的张量,在Python、NumPy、PyTorch中,底层可以理解为都是以多维数组的形成进行实现。
2024-12-25 08:50:35
1065
原创 「Python数据科学」一文搞懂NumPy中的广播机制
本文首先介绍了NumPy中element-by-element的基本原理,引出了广播机制,然后介绍了NumPy中广播的触发规则,其间,通过代码及示意图的方式演示了广播的执行过程。最后总结了广播机制的优势以及在使用中需要注意的事项。
2024-12-20 16:28:32
814
原创 「Python数据科学」ndarray的统计运算与“轴”的使用
本文简单介绍了NumPy中支持的四类统计相关的函数,分别是:顺序相关的统计函数、均值方差相关的统计函数、相关性相关的统计函数、分布相关的统计函数。同时介绍了轴的概念以及按照轴axis进行统计的不同。最后介绍了argmax()和argmin()函数的使用。
2024-12-20 11:12:13
861
原创 「Python数据科学」ndarray的逻辑运算与更灵活的数据筛选
本文简单介绍了NumPy支持的比较常用的逻辑运算,包括比较运算、逻辑运算符、三元运算,以及any和all的语义。基于这些操作的组合,就可以实现比较灵活的数组元素的筛选了。
2024-12-18 12:45:00
881
原创 「Python数据科学」NumPy数组的3种运算类型
本文按照运算的操作数的类型,将NumPy数组的运算分为:形状相同的数组的运算、数组与标量的运算、不同形状的数组的运算。NumPy数组的运算,其实是基于向量化的机制来实现的,所以数组运算,可以不用写循环代码,代码可读性和效率都较高。
2024-12-18 08:35:01
380
原创 「Python数据科学」多维数组ndarray对象重塑的常用方法
本文介绍了常见的对多维数组ndarray进行形状重塑的方法,其中:reshape()默认会返回新的视图,原始数据不变,但是需要保证形状兼容;resize()直接修改原始数组的形状,可能会修改原数据;flattern()返回一个新的拉平的数组,不共享原始数据;ravel()则返回扁平化的视图,共享数据。此外,flat属性,是一个对原始数组进行扁平化访问的迭代器,可以对原始数组直接进行遍历、读取、修改等。
2024-12-16 15:34:42
882
原创 「Python数据科学」ndarray对象的内部机理与数据存储顺序
本文首先介绍了ndarray对象的内部机理,理解了其元数据和原始数组的构成,并引出了0拷贝视图机制的基础strides步进属性。最后介绍了关于数组数据存储顺序的两种方式,并通过C指针验证了不同视图下的原始数组存储顺序不变的特性。
2024-12-16 09:27:55
1230
原创 「Python数据科学」NumPy切片与newaxis的结合,实现更灵活的操作
本文对NumPy中的切片操作进行了相应的扩展,同时引入newaxis常量和Ellipsis对象的概念,介绍了NumPy中关于轴的概念,以及升维与切片组合实现更加复杂的切片需求的实现。
2024-12-12 13:33:32
618
原创 「Python数据科学」NumPy多维数组的索引与切片
本文简单介绍了NumPy多维数组的索引和切片的相关内容,包括:基本索引方式、基本切片方式、整型数组的切片方式、布尔数组的切片方式等。同时,对比Python原生列表的索引和切片,指出了NumPy多维数组的索引和切片需要特别注意的数据截断和切片视图机制。
2024-12-12 09:16:28
976
原创 「Python数据科学」多维数组长啥样?ndarray的核心属性来帮忙
本文分别介绍了多维数组ndarray对象中的shape、dtype、ndim、size、itemsize、nbytes、T等属性。并对各个属性的含义及用法通过代码进行了演示说明。需要指出的是,shape和dtype是最核心的两个属性,其他属性均可以基于这两个属性进行计算推导。
2024-12-06 10:15:00
672
原创 「Python数据科学」一文掌握NumPy创建ndarray的常用方法
本文分别介绍了基于Python原生的序列创建NumPy数组、基于已存在的NumPy数组创建新的NumPy数组、NumPy内部函数创建特定数组、从磁盘数据创建NumPy数组和使用其他Python数据科学库的库函数创建NumPy数组的方法。
2024-12-06 06:45:00
1182
原创 「Python数据科学」对比Python的对象内存结构,分析NumPy的高性能
本文简单介绍了Python中对象的内存结构,对比了C语言数组、NumPy数组,以及Python列表存储相同数组的情况下的内存结构,从内存结构的差异上,可以看出Python为了支持灵活性和易用性,在性能上所作出的妥协。最后,通过代码简单比较了NumPy和Python列表的计算性能。
2024-12-04 15:07:31
594
原创 「Python数据科学」为什么说NumPy是必学的核心基础库
本文简单介绍了NumPy是什么,以及为什么从事数据科学的开发与研究,有必要花时间认真学习NumPy的高效使用,介绍了NumPy的一些核心特性,并通过代码着重演示了向量化和广播两个特性。希望通过这些内容的介绍,能够对NumPy有个全局性的认识,在后续的文章中将对NumPy的使用进行逐一介绍。
2024-12-04 10:28:45
747
原创 「Python数据科学」先利其器:Jupyter Notebook的简明教程
本文简单介绍了什么是Jupyter Notebook,相较于IDE,它有哪些优势。最后介绍了Jupyter Notebook的安装、启动,以及最常用的一些快捷操作。如果有Vim的使用经验,相信对Jupyter Notebook两种模式,以及命令模式中的快捷操作会有很多的熟悉感。最后,工具的学习,还是要反复实践。
2024-12-02 12:15:00
684
原创 「Python数据科学」数据科学的概念及Python常用数据科学库
本文简单介绍了数据科学的含义,强调了“跨学科”的特性;介绍了数据科学的主要工作内容;最后介绍了Python中常用的数据科学的库。需要说明的是,应当将数据科学作为一项具有加乘作用的新能力,而非一门新的学科。
2024-12-02 06:15:00
785
原创 从资源稀缺性看操作系统的设计与并发编程
总的来说,资源的稀缺性,导致了并发概念的引入,进而提升了资源的利用率,实现了批量作业整体效率的提升,但是,是以引入复杂性为代价的。现代高可用的系统架构,不断拆分、不断引入新的中间件、技术,变得越来越复杂。本质上来看,都是资源有限的约束下的无奈与妥协。现代计算机科学,要么提升算法,更加充分利用现有资源,从而满足需求;要么大量堆积资源,简单直接,大力出奇迹。所以,算法和算力,复杂和简洁,本质上都是辩证存在的!
2024-11-29 12:45:00
573
原创 118、Python并发编程:一文搞懂协程的概念及Python原生协程的使用
本文通过对多线程、多进程方案中的并发编程的问题的描述,引出了协程的概念,以及协程主要解决的问题。简单比较了进程、线程、协程各自的特点,并描述了Python中协程的实现历程。最后,通过代码演示了基于async/await的原生协程的使用。
2024-11-29 06:15:00
1243
原创 117、Python并发编程:一文搞懂Python并发模型的关键知识点
前面的文章中,已经对Python并发编程中的多线程、多进程进行了详细的介绍,也分别对相关内置模块的使用进行了演示。由于并发编程的内容比较多,本文打算就Python并发模型中的核心知识点进行一个系统的梳理,从而对并发模型有更加系统、深入的理解。
2024-11-27 12:45:00
516
原创 116、Python并发编程:使用进程池实现多进程编程的两种方法
本文首先介绍了使用进程池的优势,以及其适用的业务场景。然后,分别介绍了基于multiprocessing.Pool和concurrent.futures.ProcessPoolExecutor的进程池的创建和使用。最后,简单比较了两种实现方式。
2024-11-27 06:45:00
657
原创 115、Python并发编程:共享内存太复杂?通过Manager简化对象共享
本文简单介绍了Manager模块的使用,并简单提及了关于Manager模块的底层实现细节。最后,对比了共享内存的使用,给出结论,“Manger是一种用起来像共享内存,底层实现上像Queue和Pipe的IPC机制”。
2024-11-25 06:45:00
1882
原创 114、Python并发编程:一文搞懂为什么以及如何使用共享内存
本文以队列和管道在IPC中的性能等方面的局限性,引入了共享内存这种IPC机制。分别介绍了共享内存的概念,共享内存的使用,以及共享内存的注意事项。共享内存在提高性能的同时,也带来了使用上的复杂性。
2024-11-23 07:00:00
641
原创 113、Python并发编程:使用管道Pipe实现简单双向的数据传输
本文简单介绍了Python中Pipe的使用,Pipe两个进程间进行简单、小量数据的双向传递等相关特性,使得Pipe很适合两个进程的状态同步、命令-响应等场景的需求实现,代码编写起来,也特别简单、易读。
2024-11-22 06:45:00
838
原创 112、Python并发编程:Queue实现进程通信,此Queue非彼Queue
进程间通信(Inter-Process Communication, IPC)是并发编程中一个很核心的概念。虽然在编程模型上,多进程与多线程在代码编写上有很多的相似性,但是在进程间通信上,会存在很大的不同。1、数据隔离由于每个进程都有自己独立的内存空间,因此进程之间不能直接访问彼此的内存,多线程中通过共享变量的方式进行通信的方式,显然就行不通了。进程间的通信必须依靠特定的机制来进行,比如消息队列、管道、共享内存等。2、IPC机制的选择1)管道(Pipe)
2024-11-21 06:15:00
560
原创 111、Python并发编程:使用multiprocessing模块编写可移植的多进程
如同多线程编程中,通过Thread类实现线程对象的抽象封装。在Python中,类比Thread类,创建了Process类,实现了对进程对象的抽象封装,从而可以更加轻易地管理进程对象。在真正使用Process类之前,首先来看下Process类中的常用方法和属性。1、__init__()初始化方法如同Thread构造函数的用法一样,通常只需要传入target参数和args参数,即可快速创建一个进程对象。2、is_alive()方法用于判断进程是否在运行,仍在运行,则返回True,否则False。
2024-11-20 06:15:00
733
原创 110、Python并发编程:利用os模块轻松实现多进程编程
本文通过对多线程和多进程的比较,一方面对多线程的内容做了个梳理总结,另一方面也对多进程的内容,做了一个全局性的引入。最后,通过os模块中相关进程管理的函数,简单演示了多进程。
2024-11-19 06:15:00
1291
原创 衡量代码质量的唯一有效标准:WTFs/min
质量管理始终是各行各业始终无法回避的问题,而质量的提升始终是一个不断迭代升级的过程。在IT领域中,质量的话题主要聚焦在两个领域:数据质量管理和代码质量管理。数据质量管理,有相对系统的管理模式,比如,一般我们会从数据的准确性、完整性、唯一性、一致性、及时性、有效性等。关于代码的管理,主要有可扩展性和可读性等。本文就来围绕“代码的可扩展性”来稍微展开聊一下。
2024-11-18 06:15:00
429
原创 109、Python并发编程:多线程组件如何选,适用的才是最好的
1、Lock,用于实现共享资源保护的核心原语。2、Condition,用于多线程间的通知机制。3、Semaphore,强调有限数量资源的合理共享。4、Event,用于线程间的信号通知,控制执行顺序。5、Queue,用于线程间的数据的安全传递,作为生产者-消费者模型的基础。6、ThreadPoolExecutor,可以简化大量短时任务的管理和执行,提高资源利用率。在实际使用中,选择合适的同步原语和并发模式,可以显著提高代码的性能及可维护性。
2024-11-16 10:16:53
1009
原创 108、Python并发编程:一文搞懂队列及Python中的线程安全队列
如果有科班出身的同学,一定曾经被本科的一门核心基础课程——《数据结构和算法》折磨过。读书期间,为了考试,也许只是死记硬背知识点了,不晓得实际上有什么用。但是,有了一定的工作实践之后,再回看哪些基础课程,一定会有更加深刻的体会。队列的概念及设计理念队列(Queue)是一种非常重要的数据结构,它提供一种先进先出(FIFO)的数据处理方式。队列再许多计算机科学和实际应用中都发挥着至关重要的作用。队列的设计理念主要有:1、先进先出(FIFO):队列遵循先进先出的原则,最先进入队列的元素最先被处理。
2024-11-15 06:15:00
883
原创 107、Python并发编程:失败自动重试,一次搞懂简单实用的Timer
Timer是Python的threading模块中提供的一个定时器的组件,可以实现在指定的时间间隔后执行一个函数。从源码看,Timer模块的实现非常简单。1、Timer的实现,主要是通过继承Thread类型,实现相关线程实例化、调度的基本功能。2、内部持有一个Event事件对象,通过对象的指定timeout的wait()方法调用,实现等待指定时间再执行的效果。3、提供cancel()方法,用于设置内部事件对象的标志位,从而终止等待执行。
2024-11-14 06:30:00
875
原创 106、Python并发编程:深入浅出理解线程池的内部实现原理
本文围绕着ThreadPoolExecutor和Future对象的源码,深入介绍了相应的内部实现,以及线程池任务的处理全流程。对Future对象的设计理念和基础操作,也做了相应的展开介绍。这些都是理解线程池并发编程的核心,希望您能有所收获。
2024-11-13 06:15:00
570
原创 105、Python并发编程:化繁为简,通过线程池轻松实现多线程编程
本文首先介绍了一个完整的并发编程的解决方案应该具备的能力,然后引出了Python中通过线程池提供的一个更加完整的多线程编程的解决方案的支持,并简单介绍了线程池的常用方法。最后通过一个并发计算斐波那契数列的计算的示例,演示了线程池的使用。
2024-11-12 06:30:00
594
原创 104、Python并发编程:基于事件Event实现多线程间的同步
在Python的多线程编程中,Event是一个用于实现线程间通信的同步原语。它提供了一种机制,能够允许一个线程通知一个线程或多个线程某个等待事件的发生。Event对象维持了一个标记,这个标记可以被置为“设置”或者“未设置”。从Event的源码中,可以看出Event内部持有一个Condition对象,相关的实现也是基于Condition来实现的。1、set()方法:将事件对象标记为“设置”,并通知所有等待该事件的线程。2、clear()方法:将事件对象标记为“未设置”,使得后续的等待变得有效。
2024-11-11 06:00:00
889
原创 103、Python并发编程:使用信号量Semaphore实现资源有限的并发场景
本文首先回顾了之前介绍到的锁、条件变量和队列各自所能应对的并发同步场景,引出了资源有限的同步场景中的主角Semaphore,分别介绍了Semaphore的设计实现及使用案例。
2024-11-09 06:30:00
1077
原创 102、Python并发编程:Queue与生产者消费者模型实现解耦、协作
本文通过一个上下游任务协同的需求,引入了生产者消费者模型,同时通过两种方式模拟了生产者消费者模型的实现。最后,简单比较了deque和Queue的主要区别和适用场景。
2024-11-08 06:45:00
1533
原创 101、Python并发编程:Condition实现“排排坐分果果”的复杂同步
本文简单介绍了Condition的内部设计原理、Condition的核心方法,以及在使用Condition实现多线程的复杂同步需求时的注意事项。以上,就是本文的全部内容了,希望对您有所帮助!
2024-11-07 06:45:00
579
原创 100、Python并发编程:保护临界资源的最简单方式,加锁
本文简单介绍了使用锁的必要性、锁的底层实现原理,以及Python中关于互斥锁、可重入锁的支持,并通过具体的代码示例,演示了两种的锁的基本使用。
2024-11-06 06:15:00
675
原创 99、Python并发编程:多线程的问题、临界资源以及同步机制
多线程编程的学习,多线程模型的相关线程实现只是基础,关于线程的同步机制才是我们后续需要学习的核心。本文以多线程的引入所带来的问题展开,分别介绍了临界资源、临界区的概念,以及解决多线程问题的同步机制的各种实现。
2024-11-05 06:30:00
1021
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人