您的位置:首页 > 编程语言 > Python开发

Numpy数组优势

2018-01-31 18:54 169 查看

NumPy的数组对象

NumPy是一个开源的Python科学计算基础库,包含:

• 一个强大的N维数组对象 ndarray

• 广播功能函数

• 整合C/C++/Fortran代码的工具

• 线性代数、傅里叶变换、随机数生成等功能

同时NumPy是SciPy、 Pandas等数据处理或科学计算库的基础

标准安装的
Python
中用列表
(list)
保存一组值,可以用来当作数组使用,不过由于列表的元素可以是任何对象,因此列表中所保存的是对象的指针。这样为了保存一个简单的
[1,2,3]
,需要有
3个指针
三个整数对象
。对于数值运算来说这种结构显然比较浪费内存和CPU计算时间。

此外
Python
还提供了一个
array
模块,
array
对象和列表不同,它直接保存数值,和
C语言
一维数组
比较类似。但是由于它不支持多维,也没有各种运算函数,因此也不适合做数值运算。

NumPy
的诞生弥补了这些不足,
NumPy
提供了两种基本的对象:
ndarray
(N-dimensional array object)和
ufunc
(universal function object)。
ndarray
(下文统一称之为数组)是
存储单一数据类型
的多维数组,而
ufunc
则是能够对数组进行处理的函数。总的来说:

数组对象可以去掉元素间运算所需的循环,使一维向量更像单个数据

设置专门的数组对象,经过优化,可以提升这类应用的运算速度

观察:科学计算中,一个维度所有数据的类型往往相同。数组对象采用相同的数据类型,有助于节省运算和存储空间

性能比较

例:计算 A2+B3A2+B3,其中,A和B是一维数组

In [1]: a = [0, 1, 2, 3, 4]

In [2]: b = [9, 8, 7, 6, 5]

In [3]: import numpy as np

In [4]: nda = np.array(a)

In [5]: ndb = np.array(b)

In [6]: %timeit sum([a[i]**2 + b[i]**3 for i in range(len(a))])
4.4 µs ± 593 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

In [7]: %timeit nda ** 2 + ndb ** 3
2.51 µs ± 93.7 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)


这是在我一个干净的Ubuntu上测试的结果,可以看到Python3中ndarray的性能比list好,虽然这样还是有些的不严谨,但还是看出了ndarray的一些优势。

Numpy 导入规范

import numpy as np


尽管别名可以省略或更改,建议使用上述约定的别名,类似的科学计算相关的包别名有:

import pandas as pd
import scipy.stats as spstats
import scipy as sp
import matplotlib.pyplot as plt


别名并不强制要求,但是规范要有。

References

用Python做科学计算
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Numpy Python