数据科学入门,先学R再学Python

2018 年 9 月 26 日 论智
作者:Alan Marazzi
编译:weakish

编者按:数据科学家Alan Marazzi这篇讨论R和Python哪个对数据科学初学者更友好的文章有些偏向R语言,结论仅供参考。不过,它出色地展示了R语言在数据问题上犀利的表达力。对初学者而言,从高层抽象(由R语言中的原生结构或Numpy之类的Python第三方库提供)入手也确实更加便利。

这不是你通常在网上看到的那类争论R和Python哪个好的帖子。事实上,我根本不想讨论到底哪个好。我只想说明,想要入门数据科学的学习者,从R开始更合适。

向量

什么是向量?如果你知道矩阵,那你就知道向量。向量可以看成矩阵的行或列,也就是由数字组成的一维“列表”。通常向量用作数据表的列,因为我们确信同一列内的数据类型相同。

浮点数、整数、字符串、类别,等等,向量中的元素总是属于同一类型。这很重要,因为我们可以利用这一点加速和简化代码:解释器只需检查第一项记录的类型。你也许已经知道,向量是R的原生结构,事实上,R中标量也是向量(一维向量)。

  
  
    
  1. vec <- c(5, 3, 4)

  2. class(vec)

  3. [1] "numeric"

  4. class(3)

  5. [1] "numeric"


向量化

进行数据分析或机器学习时,常常需要处理表格形式的数据,或者,从更底层的角度来说,向量的序列。如果我想将向量中的每项记录乘2,在R中我可以非常自然地做到这一点:

  
  
    
  1. vec * 2

  2. [1] 10  6  8

Python中,向量不是原生结构,不过我们可以使用列表存储向量。所以让我们在Python 3中尝试相同的操作(你需要操心到底用Python 2还是Python 3是另一个问题):

  
  
    
  1. >>> [5, 3, 4] * 2

  2. [5, 3, 4, 5, 3, 4]

搞什么……

在Python中要得到同样的结果,你需要使用for循环:

  
  
    
  1. >>> for num in [5, 3, 4]:

  2. ...     num * 2

  3. ...

  4. 10

  5. 6

  6. 8

你可能需要把结果存储到另一个列表中,所以你需要首先初始化一个空列表来存放结果,然后启动循环,在每个迭代中添加结果:

  
  
    
  1. >>> res = []

  2. >>> for num in [5, 3, 4]:

  3. ...     res.append(num * 2)

  4. ...

  5. >>> print(res)

  6. [10, 6, 8]

在R中,你只需:

  
  
    
  1. vec <- c(5, 3, 4) * 2

  2. vec

  3. [1] 10  6  8

(译者注:不考虑引入numpy等第三方库的情况下,用Python的列表理解表达要简洁许多:[i * 2 for i in [5, 3, 4]]

我想强调的是,这主要不是少打几个字的问题,而是形成“恰当的”心智模型的问题。许多人抱怨R代码很慢,99%是因为没有向量化他们的代码,而使用“Python风格”的循环(隐式或显式)。

随机行走例子

我们将分别在R和Python中实现随机行走,Python代码取自《From Python to NumPy》一书。

让我们从最基本的循环方式开始:

  
  
    
  1. >>> import random # 需要引入random模块

  2. >>> def random_walk(n):

  3. ...     position = 0  # 初始化位置变量

  4. ...     walk = [position]  # 初始化列表

  5. ...     for i in range(n):

  6. ...         position += 2*random.randint(0, 1)-1 # 更新位置值

  7. ...         walk.append(position)  # 附加结果至行走列表

  8. ...     return walk

  9. ...

如果对象非常大,上面的代码会变得很慢,我们可以使用itertools模块改善性能:

  
  
    
  1. >>> from itertools import accumulate

  2. >>> import random

  3. >>> def random_walk_faster(n=1000):

  4. ...     steps = random.sample([1, -1]*n, n)

  5. ...     return list(accumulate(steps))

  6. ...

不过,这还是没有向量化。它不过是更高效的循环而已。要做到完全向量化,我们需要使用NumPy

  
  
    
  1. >>> import numpy as np

  2. >>> def random_walk_fastest(n=1000):

  3. ...     steps = 2*np.random.randint(0, 2, size=n) - 1

  4. ...     return np.cumsum(steps)

  5. ...

换成R语言:

  
  
    
  1. rw <- cumsum(sample(c(-1, 1), 1000, TRUE))

无需引入什么模块,无需额外定义什么函数或方法,一行搞定。(译者注:Python确实需要引入NumPy,但其实也不用额外定义函数,np.cumsum(np.random.randint(...)))。

结语

如果你想从事和数据打交道的工作,或者想要教别人如何处理数据,可以从R开始。熟练使用R之后,再开始学Python比较好。

如果你喜欢这篇文章,你可以留言或转发。你也可以订阅我的博客rdisorder。

原文地址:https://www.rdisorder.eu/2017/01/16/learn-r-before-python/

登录查看更多
0

相关内容

【2020新书】实战R语言4,323页pdf
专知会员服务
98+阅读 · 2020年7月1日
【实用书】学习用Python编写代码进行数据分析,103页pdf
专知会员服务
190+阅读 · 2020年6月29日
一份简明有趣的Python学习教程,42页pdf
专知会员服务
76+阅读 · 2020年6月22日
【实用书】Python机器学习Scikit-Learn应用指南,247页pdf
专知会员服务
257+阅读 · 2020年6月10日
算法与数据结构Python,369页pdf
专知会员服务
160+阅读 · 2020年3月4日
100行Python代码,轻松搞定神经网络
大数据文摘
4+阅读 · 2019年5月2日
深度学习线性代数简明教程
论智
11+阅读 · 2018年5月30日
实战 | 用Python做图像处理(三)
七月在线实验室
15+阅读 · 2018年5月29日
实战 | 用Python做图像处理(二)
七月在线实验室
17+阅读 · 2018年5月25日
【入门】数据分析六部曲
36大数据
17+阅读 · 2017年12月6日
机器学习入门秘笈
AI研习社
14+阅读 · 2017年12月5日
推荐|2017年最受数据科学欢迎的Top15个Python库!
全球人工智能
8+阅读 · 2017年10月28日
Python3爬虫之入门和正则表达式
全球人工智能
7+阅读 · 2017年10月9日
Python NLP 入门教程
开源中国
14+阅读 · 2017年10月1日
A Survey on Deep Learning for Named Entity Recognition
Arxiv
25+阅读 · 2020年3月13日
SepNE: Bringing Separability to Network Embedding
Arxiv
3+阅读 · 2019年2月26日
Arxiv
53+阅读 · 2018年12月11日
Feature Selection Library (MATLAB Toolbox)
Arxiv
7+阅读 · 2018年8月6日
Arxiv
8+阅读 · 2018年5月15日
VIP会员
相关VIP内容
【2020新书】实战R语言4,323页pdf
专知会员服务
98+阅读 · 2020年7月1日
【实用书】学习用Python编写代码进行数据分析,103页pdf
专知会员服务
190+阅读 · 2020年6月29日
一份简明有趣的Python学习教程,42页pdf
专知会员服务
76+阅读 · 2020年6月22日
【实用书】Python机器学习Scikit-Learn应用指南,247页pdf
专知会员服务
257+阅读 · 2020年6月10日
算法与数据结构Python,369页pdf
专知会员服务
160+阅读 · 2020年3月4日
相关资讯
100行Python代码,轻松搞定神经网络
大数据文摘
4+阅读 · 2019年5月2日
深度学习线性代数简明教程
论智
11+阅读 · 2018年5月30日
实战 | 用Python做图像处理(三)
七月在线实验室
15+阅读 · 2018年5月29日
实战 | 用Python做图像处理(二)
七月在线实验室
17+阅读 · 2018年5月25日
【入门】数据分析六部曲
36大数据
17+阅读 · 2017年12月6日
机器学习入门秘笈
AI研习社
14+阅读 · 2017年12月5日
推荐|2017年最受数据科学欢迎的Top15个Python库!
全球人工智能
8+阅读 · 2017年10月28日
Python3爬虫之入门和正则表达式
全球人工智能
7+阅读 · 2017年10月9日
Python NLP 入门教程
开源中国
14+阅读 · 2017年10月1日
Top
微信扫码咨询专知VIP会员