文档章节

使用 NumPy 进行科学计算

巴别塔工人
 巴别塔工人
发布于 2014/12/04 10:47
字数 1442
阅读 1786
收藏 4

Python 科学计算库 NumPy,其中大部分模块采用 C 语言编写,并针对科学计算(线性代数计算)设计了 ndarray(多维数组)对象,该对象类似于 Python 中的 list 对象,但却更少在应用中使用性能较差的循环。以上这些使得 NumPy 的性能比纯 Python 要高。

本文采用的系统环境是 CentOS 7.0 x64,Python 2.7.5 和 NumPy 1.9.1。假设已经执行了“import numpy as np”语句,因而在代码中使用 np 指代 numpy 库。

ndarray(多维数组)

ndarray 对象用于存储多维数组,内置支持 element-by-element 计算,无需像 Python 中 List 对象数学计算那样使用大量的循环,因而更加的高效。一个 ndarray 对象中的所有元素必须是相同的数据类型。一般使用 np.array、np.arange、np. zeros、np.ones 和 np.identity 等函数创建 ndarray 对象。

a = np.array([0,1,2,3,4])
b = np.arange(10)
c = np.zeros()
d = np.ones()
e = identity()

NumPy 中的 ndarray 对象和 Python 中的 list 对象之间可以进行转换。

# 创建 list 对象
a = range(2)
b = range(2)

# 将 list 对象转换为 ndarray 对象
m = np.array([a, b])
# array([[0, 1],
#        [0, 1]])

# 将 ndarray 对象转换为 list 对象
m.tolist()          # [[0, 1], [0, 1]]

ndarray 对象中的各元素必须是统一的数据类型。常用的数据类型有 bool、int64、float64 和 complex。NumPy 提供了数据类型转换函数,函数名称与数据类型的名称一致。ndarray 对象也提供了 astype 方法,可以转换元素的数据类型。注意:不支持将 complex 数据类型转换为 int 或 float 数据类型。

# 数据类型转换
np.float64(42)          # 42.0

# 多维数组数据类型转换
a = np.arange(10)
print a.dtype           # dtype('int64')
b = np.float64(a)
print b.dtype           # dtype('float64')
 c.astype(np.float64)
print c.dtype           # dtype('float64')

一维数组也称为 Vector(向量),对于其中元素的引用,类似于 Python 中的 list 对象的元素引用(索引从 0 开始),同样也支持“切片”和“步进”。注意:ndarray 对象的切片是内存引用,对切片进行的修改会影响 ndarray 对象。

# 创建 ndarray 对象
a = np.arange(10)          # array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
print type(a)              # numpy.ndarray

# 输出 ndarray 对象中元素的数据类型
print a.dtype          # dtype('int64')

# 输出 ndarray 对象的大小
print a.shape          # (10,)

# 引用 ndarray 对象中的元素
a[5]            # 5
a[3:7]          # array([3, 4, 5, 6])
a[:7:2]         # array([0, 2, 4, 6])
a[::-1]         # array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])

使用一维数组的 reshape 方法,可以将一维数组转换为多维数组。通过 shape 函数来获取 ndarray 对象的行数和列数。多维数组的元素访问,与一维数组的元素访问方法类似。

# 创建多维 Array 变量
m = array([np.arange(2), np.arange(2)])
# array([[0, 1],
#       [0, 1]])

# 创建一维数组
a = np.arange(24)

# 转换为多维数组
b = a.reshape(2,3,4)

# 输出多维数组的大小
print b.shape          # (2, 3, 4)

# 访问多维数组中的元素
b[:,0,0]          # array([ 0, 12])
b[0]
b[0,:,:]
b[0, ...]
# array([[ 0,  1,  2,  3],
#        [ 4,  5,  6,  7],
#        [ 8,  9, 10, 11]])
b[0,1,::2]          # array([4, 6])
b[::-1]
# array([[[12, 13, 14, 15],
#         [16, 17, 18, 19],
#         [20, 21, 22, 23]],
#        [[ 0,  1,  2,  3],
#         [ 4,  5,  6,  7],
#         [ 8,  9, 10, 11]]])

# Ravel
b.ravel()

# Flatten
b.flatten()

# Shape:修改多维数组的维度
b.shape = (6, 4)

# Transpose
b.transpose()

# Resize:修改多维数组的维度
b.resize((6, 4))

ndarray 对象还有很多有用的属性。

ndarray.ndim         # 维度
ndarray.size         # 元素个数
ndarray.itemsize     # 每个元素占用的字节数
ndarray.nbytes       # 占用的总字节数
ndarray.T            # 逆向量,等同于 ndarray.transpose() 函数
ndarray.real         # complex 的实数部分
ndarray.imag         # complex 的虚数部分
ndArray.flat         # 转为一维数组,等同于 ndarray.flatten() 函数

matrix(矩阵)

matrix(矩阵)本质上是一种特殊的 ndarray 对象,matrix 对象只可以是二维的。

ufunc(通用函数)

ufunc(通用函数)是作用在 ndarray 对象的具备 element-by-element 特性的函数。在 NumPy 中,ufunc 是 numpy.ufunc 类的实例。

创建 ndarray 对象

np.empty:创建指定维度的数值为随机数的 ndarray 对象

np.eye:创建指定维度的,对角线数值为1其余为0的 ndarray 对象

np.ones:创建指定维度的数值为1的 ndarray 对象

np.zeros:创建指定维度的数值为零的 ndarray 对象

np.full:创建指定维度和数值的 ndarray 对象

np.array:创建 ndarray 对象

np.copy:根据现有的 ndarray 对象复制出新的 ndarray 对象

np.arange:创建连续的从零开始至指定数值的 ndarray 对象

np.linspace:根据起始数值、结束数值和间隔个数,创建 ndarray 对象

np.mat:创建 matrix(矩阵)对象

操作 ndarray 对象

np.reshape:修改 ndarray 对象的维度,不改变元素的数值

np.ravel:将 ndarray 对象转换为一维数组

np.flat:将 ndarray 对象转换为一维数组

np.flatten:将 ndarray 对象转换为一维数组

np.transpose:反转 ndarray 对象的维度

np.asmatrix:将 ndarray 对象转换为 matrix 对象

输入输出

np.loadtxt:从文本文件中读取数据

np.savetxt:将数据保存至文本文件中

np.genfromtxt:从文本文件中读取数据

数据统计

np.average:计算 Array 变量中元素的平均数(通过 weights 参数进行加权计算)

np.mean:计算 Array 变量中元素的算术平均数

np.median:计算 Array 变量中元素的中位数

np.max:计算 Array 变量中元素的最大值

np.min:计算 Array 变量中元素的最小值

np.ptp:计算 Array 变量中元素的最大值和最小值的差值

np.var:计算 Array 变量中元素的方差

np.std:计算 Array 变量中元素的标准差

逻辑判断

np.all:判断指定维度是否全部值为 True

np.any:判断指定维度是否有值为 True

参考资料

《NumPy User Guide》,NumPy Community

《NumPy Reference》,NumPy Community

《NumPy Beginner's Guide》,Ivan Idris,Packt Publishing


© 著作权归作者所有

巴别塔工人
粉丝 4
博文 12
码字总数 14491
作品 0
郑州
产品经理
私信 提问
PyTorch入门学习(一):What is PyTorch?

未经允许,不得转载,谢谢~~ PyTorch是一个深度学习的框架。 简单记录整理。 Pytorch是什么 基于Python的科学计算包: 代替numpy能使用GPU进行计算 灵活性很高的一个深度学习研究平台 Tensor...

与阳光共进早餐
2018/01/05
0
0
阿里开源首款自研科学计算引擎 Mars :基于张量的统一分布式计算框架

雷锋网 AI 科技评论按:日前,阿里巴巴正式开源分布式科学计算引擎 Mars。Mars 是由阿里巴巴统一大数据计算平台 MaxCompute 研发团队历经一年多研发的基于张量的统一分布式计算框架,用其进行...

丛末
01/18
0
0
小蛇学python(16)numpy高阶用法

如果只是从事简单的数据分析,其实numpy的用处并不是很大。简单了解一下numpy,学好pandas已经够用,尤其是对于结构化或表格化数据。但是精通面向数组的编程和思维方式是成为python科学计算牛...

跌跌撞撞小红豆
2018/07/12
0
0
3 个用于数据科学的顶级 Python 库

使用这些库把 Python 变成一个科学数据分析和建模工具。 Python 的许多特性,比如开发效率、代码可读性、速度等使之成为了数据科学爱好者的首选编程语言。对于想要升级应用程序功能的数据科学...

作者: Dr.michael J.garbade
2018/10/04
0
0
一篇文章掌握Numpy的基本用法

使用numpy进行向量化运算 从上面的运行结果可以看出,numpy的向量化运算的效率要远远高于python的循环遍历运算(效率相差好几百倍)。 (1ms=1000µs) 2 创建ndarray数组 首先需要导入numpy...

dby_freedom
2018/10/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周四乱弹 —— 如果人生有机会 carl+z

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @巴拉迪维 :How I wish I could choose between Heaven and Hell. How I wish I would save my soul. #今日歌曲推荐# 《Tears And Rain》- J...

小小编辑
35分钟前
137
4
一步步教你怎么用python写贪吃蛇游戏

目录 0 引言 1 环境 2 需求分析 3 代码实现 4 后记 0 引言 前几天,星球有人提到贪吃蛇,一下子就勾起了我的兴趣,毕竟在那个Nokia称霸的年代,这款游戏可是经典中的经典啊!而用Python(蛇)...

上海小胖
55分钟前
1
0
NIO基于长度域的报文在Netty下的解码

1, 先复习一下粘包/拆包 1.1, 粘包/拆包的含义 TCP是个“流”协议, 并不了解上层业务数据的具体含义, 它会根据TCP缓冲区的实际情况进行包的划分,所以在业务上认为,一个完整的包可能会被TCP...

老菜鸟0217
今天
8
0
从零开始搭建spring-cloud(2) ----ribbon

在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的。Spring cloud有两种服务调用方式,一种是ribbon+restTemplate,另一种是feign。 其实我们已经在上...

Vincent-Duan
今天
25
0
get和post的区别?

doGet:路径传参。效率高,安全性差(get的传送数据量有限制,不能大于2Kb) doPOST:实体传参。效率低,安全性好 建议: 1、get方式的安全性较Post方式要差些,包含机密信息的话,建议用Pos...

花无谢
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部