返回介绍

5.2 NumPy

发布于 2024-01-21 22:13:25 字数 4535 浏览 0 评论 0 收藏 0

NumPy是一个Python科学计算的基础模块。NumPy不但能够完成科学计算的任务,也能够被用作有效的多维数据容器,用于存储和处理大型矩阵。NumPy的数据容器能够保存任意类型的数据,这使得NumPy可以无缝并快速地整合各种数据。在性能上NumPy比起Python自身的嵌套列表结构要高效得多。Python在科学计算的其他模块大多数都是在NumPy的基础上编写的。

1.创建数组

NumPy有多种方法去创建数组,例如通过元组和列表。代码清单5-1是NumPy创建数组的一个实例。

代码清单5-1 NumPy创建数组

import NumPy as np     #导入模块
print '''创建数组
'''
arr1 = np.array([2,3,4])     # 通过列表创建数组
arr2 = np.array([(1.3,9,2.0),(7,6,1)])     # 通过元组创建数组
arr3 = np.zeros((2,3))     # 通过元组
(2,3)生成零矩阵
(矩阵也是数组的一种
)
arr4 = np.identity(3)     # 生成
3维的单位矩阵
arr5 = np.random.random(size = (2,3))     # 生成每个元素都在
[0,1]之间的随机矩阵
print arr1
# result:
# [2 3 4]
print arr2
# result:
# [[ 1.3  9.   2. ]
#  [ 7.   6.   1. ]]
print arr3
# result:
# [[ 0.  0.  0.]
#  [ 0.  0.  0.]]
print arr4
# result:
# [[ 1.  0.  0.]
#  [ 0.  1.  0.]
#  [ 0.  0.  1.]]
print arr5
# result:
# [[ 0.31654004  0.87056375  0.29050563]
#  [ 0.55267505  0.59191276  0.20174988]]
print arr6
# result: [ 5  8 11 14 17]
print arr7
# result: [ 0.    0.25  0.5   0.75  1.    1.25  1.5   1.75  2.  ]

*代码详见:示例程序/code/5-2.py

2.访问数组

创建数组后,NumPy有很多方法接口去访问数组的属性。在科学计算时,我们需要频繁访问数组元素,通过NumPy索引、切片和迭代器方法能够快速灵活地访问数组,如代码清单5-2所示。

代码清单5-2 NumPy——访问数组

# 查看数组的属性
print arr2.shape     # 返回矩阵的规格
# result: (2,3)
print arr2.ndim     # 返回矩阵的秩
# result: 2
print arr2.size     # 返回矩阵元素总数
# result: 6
print arr2.dtype.name     # 返回矩阵元素的数据类型
# result: float64
print type(arr2)     # 查看整个数组对象的类型
# result:
 <type 'numpy.ndarray'>
# 通过索引和切片访问数组元素
def f(x,y):
    return 10*x+y
arr8 = np.fromfunction(f,(4,3),dtype = int)
print arr8
# result:
# [[ 0  1  2]
# [10 11 12]
# [20 21 22]
# [30 31 32]]
print arr8[1,2]     #返回矩阵第
1行,第
2列的元素(注意下标从
0开始)
# result: 12
print arr8[0:2,:]     #切片,返回矩阵前
2行
# result:
# [[ 0  1  2]
#  [10 11 12]]
print arr8[:,1]     #切片,返回矩阵第
1列
# result: [ 1 11 21 31]
print arr8[-1]     #切片,返回矩阵最后一行
# result: [30 31 32]
# 通过迭代器访问数组元素
for row in arr8:
    print row
# result:
# [0 1 2]
# [10 11 12]
# [20 21 22]
# [30 31 32]
for element in arr8.flat:
    print element
# 输出矩阵全部元素

*代码详见:示例程序/code/5-2.py

3.数组的运算

NumPy的运算是相当方便高效的,其运算符都是针对整个数组,比起使用for循环,使用NumPy的运算方法在速度上要优秀得多,如代码清单5-3所示。如果NumPy数组是一个矩阵,还支持矩阵求逆、转置等操作。

代码清单5-3 NumPy——数组的运算

print '''数组的运算
'''
arr9 = np.array([[2,1],[1,2]])
arr10 = np.array([[1,2],[3,4]])
print arr9 - arr10  
# result:
# [[ 1 -1]
#  [-2 -2]]
print arr9**2
# result:
# [[4 1]
#  [1 4]]
print 3*arr10
# result:
# [[ 3  6]
#  [ 9 12]]
print arr9*arr10               #普通乘法
# result:
# [[2 2]
#  [3 8]]
print np.dot(arr9,arr10)          #矩阵乘法
# result:
# [[ 5  8]
#  [ 7 10]]
print arr10.T               #转置
# result:
# [[1 3]
#  [2 4]]
print np.linalg.inv(arr10)     #返回逆矩阵
# result:
# [[-2.   1. ]
#  [ 1.5 -0.5]]
print arr10.sum()               #数组元素求和
# result: 10
print arr10.max()               #返回数组最大元素
# result: 4
print arr10.cumsum(axis = 1)     #按行累计总和
# result:
# [[1 3]
#  [3 7]]

*代码详见:示例程序/code/5-2.py

4.NumPy通用函数

许多数学上的函数,如sin、cos等在NumPy都有重新的实现。在NumPy中,这些函数称为通用函数(Universal Functions)。通用函数是针对整个NumPy数组的,因此我们不需要对数组的每一个元素都进行一次操作,它们都是以NumPy数组作为输出的,如代码清单5-4所示。

代码清单5-4 NumPy通用函数

print '''NumPy通用函数
'''
print np.exp(arr9)          #指数函数
# result:
# [[ 7.3890561   2.71828183]
#  [ 2.71828183  7.3890561 ]]
print np.sin(arr9)          #正弦函数(弧度制)
# result:
# [[ 0.90929743  0.84147098]
#  [ 0.84147098  0.90929743]]
print np.sqrt(arr9)     #开方函数
# result:
# [[ 1.41421356  1.        ]
#  [ 1.          1.41421356]]
print np.add(arr9,arr10)     #和
arr9+arr10效果一样
# result:
# [[3 3]
#  [4 6]]

*代码详见:示例程序/code/5-2.py

5.数组的合并和分割

下面介绍如何通过方法接口对数组进行合并和分割,如代码清单5-5所示:

代码清单5-5 数组合并与分割

print '''数组合并与分割
'''
# 合并
arr11 = np.vstack((arr9,arr10))     #纵向合并数组,由于与堆栈类似,故命名为
vstack
print arr11
# result:
# [[2 1]
#  [1 2]
#  [1 2]
#  [3 4]]
arr12 = np.hstack((arr9,arr10))     #横向合并数组
print arr12
# result:
# [[2 1 1 2]
#  [1 2 3 4]]
# 分割
print np.hsplit(arr12,2)          # 将数组横向分为两部分
# result:
# [array([[2, 1],
#        [1, 2]]), 
# array([[1, 2], [3, 4]])]
print np.vsplit(arr11,2)          # 数组纵向分为两部分
# result:
# [array([[2, 1],
#        [1, 2]]),
# array([[1, 2], [3, 4]])]

*代码详见:示例程序/code/5-2.py

由于篇幅所限,上面未能将NumPy的所有方法逐一介绍,以下附一张NumPy上面未涉及但却常用的方法清单,如表5-1所示,方便读者更好地了解NumPy的功能。

表5-1 其他NumPy常用方法

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文