PythonTip >> 博文 >> python NumPy

NumPy 简介

zihua 2014-01-20 23:01:45 点击: 890 | 收藏


NumPy是Python科学计算的基础包,是一个提供了多维数组,其他各种派生的对象(如标记数组,矩阵等),还包括一系列的对数组进行快速操作的函数方法等 ,如数理上的,逻辑上的,形状操作,排序,选择,I/O,离散傅里叶变换,基本的线性代数,基本的统计操作,随机仿真等等。

NumPy包的核心就是ndarray对象。它是一个封装好的,只能存储同个类型数据的多维数组,很多的操作函数,为了提高性能,使用的是编译好的代码。关于NumPy的数组和标准Python类库里面的列表的一些不同是需要强调一下的:

1:NumPy在创建的时候就有了固定的大小,不像Python的列表可以自动增长。改变一个数组的大小,就会创建一个新的数组,同时删除掉原来的那个。

2:NumPy数组里面的数据必须是同一个类型的,也因此,它们在内存上的大小是一样的(指数据)。有一个例外就是,如果给数组的是一个对象,从而可以使得数组里面的数据有不同的大小。

3:NumPy数组可以让在大型数据上的高级数学的或者其他类型的操作变得更加的高效。典型的一个例子,即我们可以用比标准的Python列表更少的代码和更高效实现这些操作。

4:有非常多的科学上的或者数学上的Python包都使用了NumPy。尽管这些包都支持传统的Python列表输入,但是在处理之前,都会转换成NumPy的数组,而且它们更多的是NumPy数组。换句话说,为了能高效的利用目前大部分(甚至是所有)的科学数学的Python程序,仅仅知道Python内建的列表是不够的,你们必须了解和会使用NumPy数组。

列表的大小和处理速度在科学计算上特别重要。一个简单的例子,可以看看操作一个同时有相应的元素在其他的与它相同长度的队列上的1-D队列的例子。如果数据是存储在两个Python列表a和b内的,我们可以迭代出每个元素:

c = []
for i in range(len(a)):
    c.append(a[i]*b[i])

这样就能得出正确的答案了,但是如果a和b都有上亿条的数据,我们将为Python不高效的循环付出可怕的代价。不过我们可以用C语言来更快的完成同样的任务(为了说明更清晰些,我们忽略了变量声明和初始化,还有内存地址等内容):

for (i = 0; i < rows; i++): {
  c[i] = a[i]*b[i];
}

这样就能节省所有在解释Python代码和操纵Python对象上的开销,但是Python代码少的优势却没有了,而且,如果数据变成了多维的话,我们的编码工作将会增加更多。对于一个二维数组来说,比如,C代码(像前面一样省略了些东西)就会增长到如下的量:


for (i = 0; i < rows; i++): {
  for (j = 0; j < columns; j++): {
    c[i][j] = a[i][j]*b[i][j];
  }
}

NumPy则能给我们提供最完美的方案:当一个多维数组被包括进来的时候,元素对元素的操作是默认模式,而且,这个元素对元素的操作是用C写的,并预先编译好了以提高操作速度。

c = a * b

上面这一行的代码,就能达到前面那些代码的效果,接近于C的速度,但是却有我们期盼的有着Python代码简洁的特征。(实际上,NumPy idiom更加简单)。最后一个例子展示了提供了NumPy如此强大功能的两个特征,向量化和广泛性。

向量化说的是将循环,索引等内容在代码里面屏蔽了。当然,这些其实都是在进行着的,不过是在幕后进行着(优化过的,编译好的C代码)。向量化的代码有非常多的优势,比如:

1:向量化的代码更简洁和更易读

2:代码量越少,表明bug就越少

3:代码更像标准的数学表示(让代码更容易写,特别的,让代码在数学结构上更准确)

4:向量化能使得代码更加的Pythonic(没有向量化,我们的代码就必须用不高效和难以阅读的for循环来迭代了)

广泛性是用来描述内含的元素对元素的操作表现。总的来说,在NumPy里所有的操作(不仅仅是算法操作,还包括逻辑,按位,函数等)都是在这些内含的元素对元素的操作的基础上的,所以他们是broadcast的)。而且,上面的这个例子中,a和b能是同一个形状的多维数据,或者一个是标量的,一个是数组的,或者可能是两个不同形状的数组。很明显,通过这个广泛性,小数组也能扩展为大数组的形状。

利用ndarray,NumPy完整支持所有的面向对象方法。

原文链接:http://www.wumii.com/item/kITXuRMA

作者:zihua | 分类: python NumPy | 标签: numpy python | 阅读: 890 | 发布于: 2014-01-20 23时 |