加入收藏 | 设为首页 | 会员中心 | 我要投稿 晋中站长网 (https://www.0354zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 运营中心 > 网站设计 > 教程 > 正文

Python,Numpy,Pandas…数据科学家必备排序技巧

发布时间:2019-09-11 17:41:28 所属栏目:教程 来源:读芯术
导读:对数据进行分类整理是数据科学家和数据工程师的基础工作。Python会提供许多内置库,优化排序选项。有些库甚至可以同时在GPU上运行。令人惊奇的是,一些排序方法并没有使用之前所述的算法类型,其他方法的执行效果也不如预期。 选择使用哪种库和哪类排序算
副标题[/!--empirenews.page--]

对数据进行分类整理是数据科学家和数据工程师的基础工作。Python会提供许多内置库,优化排序选项。有些库甚至可以同时在GPU上运行。令人惊奇的是,一些排序方法并没有使用之前所述的算法类型,其他方法的执行效果也不如预期。

选择使用哪种库和哪类排序算法着实难办,因为算法的执行变化很快。本文将具体展开讲解,提供一些帮助记忆算法的技巧,分享测速的结果。

Python,Numpy,Pandas…数据科学家必备排序技巧
分好类的茶

开始排序吧!

更新于2019年7月17日:速度测试结果现在包括PyTorch和TensorFlow的GPU执行。TensorFlow还包括tensorflow==2.0.0-beta1和tensorflow-gpu==2.0.0-beta1下的CPU结果。令人感到惊奇的发现是:PyTorch GPU变亮的速度更快,TensorFlow GPU比TensorFlow CPU速度更慢。

有许多不同的基本排序算法。有些比其他执行速度更快、占用内存更小。有些适合处理大数据,还有些可以更好地对特定序列数据进行排排序。可参见下表了解许多常用算法的时间和空间复杂性。

Python,Numpy,Pandas…数据科学家必备排序技巧
图片来自 http://bigocheatsheet.com/

了解基础的算法并不能解决大多数数据科学问题。事实上,过早的优化处理说不定什么时候就会被视为错误源泉。不过需要重复排序大量数据时,知道使用哪个库和哪些关键字参数会十分有用。以下是一个备忘表。

Python,Numpy,Pandas…数据科学家必备排序技巧

Google表格可在此处获取

多年来,许多库的排序算法都发生了变化。用于本文分析的软件版本如下。

  • python 3.6.8
  • numpy 1.16.4
  • pandas 0.24.2
  • tensorflow==2.0.0-beta1
  • #tensorflow-gpu==2.0.0-beta1 slows sorting
  • pytorch 1.1

让我们从基础开始吧!

Python (vanilla版)

Python,Numpy,Pandas…数据科学家必备排序技巧

Python包含两个内置排序法。

  • my_list.sort()对原有列表进行排序。改变了列表。sort()返回None。
  • sorted(my_list)生成任何可迭代的排序副本。sorted()返回已排序的迭代。sort()不会改变原始迭代。

sort()应该更快,因为已到位。神奇的是这不是下面测试中的发现。就地排序更危险,因为会改变原始数据。

Python,Numpy,Pandas…数据科学家必备排序技巧
香草味冰激凌

说到vanilla版Python,本文呈现的默认排序顺序都是升序—从小到大。大多数排序方法采用关键字参数,将顺序切换为降序。对大脑来说很不幸,因为每个库的参数名称都不同。

要将vanilla Python中排序方式更改为降序,通过reverse = True.

key可以作为关键字参数来传递,从而创建自己的排序标准。例如,sort(key = len)将按照每个列表项的长度排序。

Vanilla Python中唯一使用的排序算法是Timsort。Timsort会根据要排序的数据特征选择排序方法。举个例子,如果排短列表,就采用插入排序。

Timsort以及Vanilla Python的其他算法都很稳定。这意味着如果有多个相同值,这些数据在排序后仍维持原始顺序。

想要记住sort()与sorted()不同,就记着sorted比sort单词长,并且因复制需要排序时间会更长。虽然下面的结果与传统观念相悖,但助记符仍然起作用。

NumPy

Python,Numpy,Pandas…数据科学家必备排序技巧

Numpy是用于科学计算的Python基础库。与vanilla Python一样,有两种执行方式,一种是变异数组,另一种是数据的复制。

  • my_array.sort()改变有序数组并返回已排序数组。
  • np.sort(my_array)返回已排序数组的副本,因此原始数组不会改变。

以下是可选参数。

  • axis:int,可选—要排序的轴。默认值为-1,表示沿最后一个轴排序。
  • kind:{'quicksort','mergesort','heapsort','stable'},可选—排序算法。默认为'quicksort'。详细信息如下。
  • order:str或str的列表,可选—当a是已定义字段的数组时,该参数会指定首先比较哪一字段,其次是哪个等等。可以指定单个字段为字符串,而且不是所有字段都需指定,不过仍需按照未指定字段在dtype中的顺序执行,打破联系。

现在,人们使用的排序算法与根据名字联想的略有不同。通过kind = quicksort意味着排序实际是从introsort算法开始的。

若[它]没有明显进展,则会切换成堆排序算法。执行该操作最坏的情况就是产生快速排序O(n * log(n))。Stable会自动为正在排序的数据类型选择最稳定的排序算法。目前依据数据类型,它与合并排序一起映射到tim排序或基数排序中。API前向兼容性目前抑制了选择执行的能力,并且是不同数据类型的硬连线。添加Timsort是为了更好地处理已完成或几乎排好序的数据。对于随机数据,timsort在处理方式上几乎与mergesort相同。现在timsort用于稳定排序,而在没有其他选择的情况下,quicksort仍为默认排序...'mergesort'和'stable'会映射到整数数据类型的基数排序。 来自Numpy文档 -(部分内容有改动)

其中一点是Numpy提供了比vanilla Python排序算法选项更大的控制范围。第二点是kind关键字值不一定与实际排序类型相对应。最后一点是mergesort和stable值是稳定的,但quicksort和heapsort不是。

Numpy排序是列表中唯一没有用关键字参数来反转排序顺序的操作。幸运的是,这个可快速反转数组顺序:my_arr [:: -1]。

Numpy算法选项在更受欢迎的Pandas中也适用—而且这些功能更容易保持稳定。

(编辑:晋中站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读