深入理解 NumPy:从基础到高级应用

NumPy 是 Python 中用于科学计算的核心库,它提供了高性能的多维数组对象 ndarray 以及一系列用于操作这些数组的工具。本文将详细介绍 NumPy 的基础知识、数组操作、数据类型、矩阵运算、广播机制以及统计分析等功能,并通过丰富的代码示例帮助你快速掌握 NumPy。

一、简介

NumPy 主要用于存储和处理大型矩阵,提供了一种存储单一数据类型的多维数组对象 ndarray。此外,NumPy 还提供了多种运算函数,能够完成数据计算和统计分析,是数据分析的重要工具包。

二、数组对象 (ndarray)

1. 创建数组对象

(1)创建自定义数组

import numpy as np

# 创建一个自定义数组
a = np.array([1, 2, 3], dtype=float)
print(a)  # 输出: [1. 2. 3.]

# 通过 arange 函数创建一维数组
b = np.arange(0, 10, 2)
print(b)  # 输出: [0 2 4 6 8]

# 创建一维等差数组
c = np.linspace(0, 1, 5)
print(c)  # 输出: [0.   0.25 0.5  0.75 1.  ]

# 创建全零数组
d = np.zeros((3, 4))
print(d)
# 输出:
# [[0. 0. 0. 0.]
#  [0. 0. 0. 0.]
#  [0. 0. 0. 0.]]

# 创建全为 1 的数组
e = np.ones((2, 3), dtype=int)
print(e)
# 输出:
# [[1 1 1]
#  [1 1 1]]

# 创建对角线全为 1 的多维数组
f = np.eye(3)
print(f)
# 输出:
# [[1. 0. 0.]
#  [0. 1. 0.]
#  [0. 0. 1.]]

(2)创建随机数组

# 创建 0-1 之间的随机浮点数一维数组
g = np.random.random(5)
print(g)  # 输出: [0.12345678 0.23456789 0.34567891 0.45678912 0.56789123]

# 创建指定范围的随机整数多维数组
h = np.random.randint(1, 10, size=(2, 3))
print(h)
# 输出:
# [[5 6 7]
#  [8 9 1]]

# 创建服从均匀分布的随机数组
i = np.random.rand(2, 3)
print(i)
# 输出:
# [[0.123456 0.789101 0.456789]
#  [0.765432 0.234567 0.987654]]

# 创建服从正态分布的随机数组
j = np.random.randn(2, 3)
print(j)
# 输出:
# [[ 0.123 -0.456 0.789]
#  [-1.234 0.567 -0.890]]

2. 数组对象属性

# 创建一个示例数组
a = np.array([[1, 2, 3], [4, 5, 6]])

# 数组维数
print(a.ndim)  # 输出: 2

# 数组形状
print(a.shape)  # 输出: (2, 3)

# 数组元素总个数
print(a.size)  # 输出: 6

# 数组元素的数据类型
print(a.dtype)  # 输出: int64

# 每个元素的大小(以字节为单位)
print(a.itemsize)  # 输出: 8

3. 改变数组形状

# 使用 shape 改变形状
a = np.arange(12).reshape(3, 4)
print(a)
# 输出:
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]

# 使用 reshape 改变形状
b = a.reshape(2, 6)
print(b)
# 输出:
# [[ 0  1  2  3  4  5]
#  [ 6  7  8  9 10 11]]

# 展平数组
c = a.ravel()
print(c)  # 输出: [ 0  1  2  3  4  5  6  7  8  9 10 11]

# 组合数组
d = np.hstack((a, b))
print(d)
# 输出:
# [[ 0  1  2  3  0  1  2  3  4  5]
#  [ 4  5  6  7  6  7  8  9 10 11]
#  [ 8  9 10 11  6  7  8  9 10 11]]

# 分割数组
e, f = np.hsplit(d, 2)
print(e)
# 输出:
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]

4. 访问数组

# 一维数组的访问
a = np.array([1, 2, 3, 4, 5])
print(a[2])  # 输出: 3

# 二维数组的访问
b = np.array([[1, 2, 3], [4, 5, 6]])
print(b[1, 2])  # 输出: 6

三、数据类型

NumPy 的数据类型比 Python 内置的数据类型丰富,常用的数据类型包括:

  • int8, int16, int32, int64
  • uint8, uint16, uint32, uint64
  • float16, float32, float64
  • complex64, complex128
  • bool
  • str, unicode

四、numpy 的矩阵对象

1. 创建矩阵

# 创建一个 2x2 矩阵
a = np.matrix('1 2; 3 4')
print(a)
# 输出:
# [[1 2]
#  [3 4]]

2. 矩阵属性

# 转置
print(a.T)
# 输出:
# [[1 3]
#  [2 4]]

# 共轭转置
print(a.H)
# 输出:
# [[1 3]
#  [2 4]]

# 逆矩阵
print(a.I)
# 输出:
# [[-2.   1. ]
#  [ 1.5 -0.5]]

# 返回自身数据的二维数组的一个视图
print(a.A)
# 输出:
# [[1 2]
#  [3 4]]

3. 矩阵运算

# 四则运算
b = np.matrix('5 6; 7 8')
print(a + b)
# 输出:
# [[ 6  8]
#  [10 12]]

print(a * b)
# 输出:
# [[19 22]
#  [43 50]]

# 比较运算
print(a > 2)
# 输出:
# [[False False]
#  [ True  True]]

# 逻辑运算
print(np.any(a > 2))  # 输出: True
print(np.all(a > 2))  # 输出: False

五、ufunc 函数 (Universal Function)

1. 概念

ufunc 是一种能够对数组中所有元素进行操作的函数,结果是以数组形式输出,因此不需要对数组每个元素都进行操作,所以比 math 库中的函数操作效率高。

2. 广播机制

广播是指不同形状的数组之间进行算术运算的一种方式。广播机制遵循以下四条原则:

  1. 参与运算的数组其中一个的维度为 1 且列相等。
  2. 参与运算的
本文来源于互联网,著作权归作者 [  ] 享有,本文仅供个人学习、研究和欣赏使用,如有异议,请联系站务及时处理。

▋ 发表留言

?