R 用户如何使用 Numpy?

10 投票
2 回答
20956 浏览
提问于 2025-04-16 03:09

我是一名使用R和Python很久的用户。平时我用R来做数据分析,而用Python处理一些文本和脚本相关的工作。最近我处理的数据集越来越大,这些文件通常是二进制格式或文本格式。我的工作主要是应用统计学或机器学习算法,并制作统计图表。有时候我会用R配合SQLite,遇到需要大量迭代的任务时会写C语言。在考虑使用Hadoop之前,我想先花点时间学习NumPy和Scipy,因为我听说它们在内存管理方面做得更好,而且从我现在的背景转到NumPy和Scipy似乎也不太难。我想知道有没有人使用过这两个工具,可以分享一下在这方面的改进,以及NumPy中有没有相关的用法。我也知道Rpy2这个工具,但我在想NumPy和Scipy是否能满足我大部分的需求。谢谢!

2 个回答

12

我每天都在使用NumPy,R也差不多。

在进行大量数字计算时,我更喜欢NumPy,而不是R,差别很大(包括R的包,比如'Matrix')。我觉得NumPy的语法更简洁,功能更多,计算速度也更快(虽然我并不觉得R慢)。比如,NumPy的广播功能,我觉得在R中是没有类似的东西。

举个例子,要从一个csv文件中读取数据集,并把它“标准化”,以便输入到机器学习算法中(比如,先计算均值中心,然后重新缩放每个维度),只需要这样做:

data = NP.loadtxt(data1, delimiter=",")    # 'data' is a NumPy array
data -= NP.mean(data, axis=0)
data /= NP.max(data, axis=0)

另外,我发现当我在编写机器学习算法时,我需要可以逐个元素操作的数据结构,并且这些结构还要能理解线性代数(比如,矩阵乘法、转置等)。NumPy很懂这一点,让你可以轻松创建这些混合结构(不需要重载操作符或子类化等)。

你不会对NumPy/SciPy感到失望,反而会感到惊讶。

所以,这里有一些建议——一般来说,特别是考虑到你问题中的情况:

  • 安装NumPy和SciPy。大致来说,NumPy提供核心数据结构(特别是ndarray),而SciPy(实际上比NumPy大好几倍)提供特定领域的函数(比如,统计、信号处理、积分)。

  • 安装仓库版本,特别是关于NumPy,因为开发版本是2.0。Matplotlib和NumPy紧密集成,当然你可以单独使用其中一个,但它们在Python库中都是各自领域的最佳选择。你可以通过easy_install来获取这三者,我想你已经这样做了。

  • NumPy/SciPy有几个模块专门针对机器学习/统计,包括聚类包和统计包。

  • 还有一些针对一般计算的包,但这些包可以让编写机器学习算法的速度快很多,特别是优化线性代数

  • 还有SciKits,这些不包含在基础的NumPy或SciPy库中;你需要单独安装它们。一般来说,每个SciKit都是一组方便的包装器,用来简化特定领域的编码。你可能会发现最相关的SciKit是:ann(近似最近邻),和learn(一组机器学习/统计回归和分类算法,比如,逻辑回归、多层感知器、支持向量机)。

12

在进行机器学习和统计分析时,R语言的一个大优势就是它有很多不同的库可供使用。根据我的了解,SciPy和SciKits并不能完全替代R的CRAN库。

关于内存使用,R是通过值传递的方式,而Python则是通过引用传递。值传递可能让代码看起来更“直观”,而引用传递则能更好地优化内存使用。Numpy还允许对数组进行“视图”操作,这就像是创建了子数组,但并没有实际复制数据。

在速度方面,纯Python在访问数组中的单个元素时比纯R要快,但当涉及到Numpy数组时,这种优势就不复存在了(可以参考这个基准测试)。幸运的是,Cython可以让你轻松获得显著的速度提升。

如果你在处理大数据,我发现Python在存储数组方面的支持更好,比如使用HDF5格式。

我不确定你是否应该放弃其中一个去使用另一个,但rpy2可以帮助你探索可能的过渡选项(数组可以在R和Numpy之间传递,而不需要复制数据)。

撰写回答