16 NumPy 广播规则

16 NumPy 广播规则

在 NumPy 中,广播是一种强大的机制,可以让不同形状的数组进行数学运算。通过广播,NumPy 能够在进行运算时自动扩展数组以使其形状相同,而无需创建额外的内存空间。

广播的基本规则

广播遵循一定的规则,以确定两个数组在进行运算时如何对齐。这些规则可以总结为以下几点:

  1. 如果输入数组的维度不同,则在较小的数组的形状前面添加 1,直到两个数组的形状相同。
  2. 如果某个维度的大小不匹配且不是 1,则会引发错误。
  3. 如果某个数组的某个维度为 1,则在该维度上可以进行扩展,使其在进行运算时可视为与具有相应维度的数组相同大小的数组。

下面我们通过具体例子来更好地理解这些规则。

示例 1:一维与二维数组相结合

1
2
3
4
5
6
7
8
9
10
11
import numpy as np

# 创建一个一维数组
a = np.array([1, 2, 3])

# 创建一个二维数组
b = np.array([[10], [20], [30]])

# 应用广播
result = a + b
print(result)

输出:

1
2
3
[[11 12 13]
[21 22 23]
[31 32 33]]

在这个例子中,a 是一个形状为 (3,) 的一维数组,而 b 是一个形状为 (3, 1) 的二维数组。当进行 a + b 计算时,广播会将 a 的形状变为 (1, 3),然后两个数组的形状变为 (3, 3),从而可以进行逐元素相加。

示例 2:不同维度之间的广播

1
2
3
4
5
6
7
8
9
10
11
# 创建一个形状为 (3, 4) 的二维数组
c = np.array([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]])

# 创建一个形状为 (4,) 的一维数组
d = np.array([10, 20, 30, 40])

# 应用广播
result2 = c + d
print(result2)

输出:

1
2
3
[[11 22 33 44]
[15 26 37 48]
[19 30 41 52]]

在这个例子中,c 是一个形状为 (3, 4) 的二维数组,而 d 是一个形状为 (4,) 的一维数组。这里 d 会被视为 [[10, 20, 30, 40]],然后进行广播,使得每一行都与 d 进行相加。

示例 3:错误情况

1
2
3
4
5
6
7
8
9
10
11
12
13
# 创建一个形状为 (2, 3) 的数组
e = np.array([[1, 2, 3],
[4, 5, 6]])

# 创建一个形状为 (2, 2) 的数组
f = np.array([[1, 2],
[3, 4]])

# 尝试相加 e 和 f
try:
result3 = e + f
except ValueError as ve:
print(ve)

输出:

1
operands could not be broadcast together with shapes (2,3) (2,2)

在这个例子中,ef 的形状不兼容,无法进行广播。e 的形状为 (2, 3),而 f 的形状为 (2, 2),因此会引发错误。

总结

NumPy 的广播规则让不同形状的数组之间进行数学运算变得非常灵活和方便。了解并掌握这些规则能够帮助我们在数据处理和科学计算中更加高效地运用 NumPy。如果能充分利用广播机制,我们就能在不显式地复制数据的情况下,执行更复杂的操作。

17 NumPy 零基础教程 - 应用实例

17 NumPy 零基础教程 - 应用实例

创建 NumPy 数组

在 NumPy 中,数组是主要的数据结构之一。可以用numpy.array()函数从列表或元组创建数组。

1
2
3
4
5
6
7
8
9
import numpy as np

# 从列表创建一维数组
array_1d = np.array([1, 2, 3, 4, 5])
print(array_1d)

# 从嵌套列表创建二维数组
array_2d = np.array([[1, 2, 3], [4, 5, 6]])
print(array_2d)

数组运算

NumPy 提供了丰富的运算功能,可以进行加、减、乘、除等操作。

1
2
3
4
5
6
7
8
9
10
11
# 创建两个数组
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])

# 数组加法
result_add = a + b
print("加法结果:", result_add)

# 数组乘法
result_multiply = a * b
print("乘法结果:", result_multiply)

数组切片与索引

切片和索引是操作数组的基本手段,可以方便快捷地获取数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
array_2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

# 获取第二行
row = array_2d[1]
print("第二行:", row)

# 获取第一列
column = array_2d[:, 0]
print("第一列:", column)

# 获取特定元素
element = array_2d[2, 1]
print("特定元素:", element)

数组统计与汇总

使用 NumPy,可以轻松地进行统计分析,比如计算平均值、标准差等。

1
2
3
4
5
6
7
8
9
10
11
12
13
data = np.array([1, 2, 3, 4, 5])

# 计算平均值
mean = np.mean(data)
print("平均值:", mean)

# 计算标准差
std_dev = np.std(data)
print("标准差:", std_dev)

# 计算和
sum_data = np.sum(data)
print("总和:", sum_data)

数组的拼接与分割

可以使用numpy.concatenate()numpy.split()进行数组的拼接与分割。

1
2
3
4
5
6
7
8
9
# 拼接数组
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
concatenated = np.concatenate((a, b))
print("拼接结果:", concatenated)

# 分割数组
split_array = np.split(concatenated, 2)
print("分割结果:", split_array)

广播机制

NumPy 的广播机制允许不同形状的数组进行运算,这在处理数据时非常有用。

1
2
3
4
5
6
7
8
9
# 一维数组与标量运算
array = np.array([1, 2, 3])
result = array + 5
print("标量加法结果:", result)

# 二维数组与一维数组运算
array_2d = np.array([[1, 2, 3], [4, 5, 6]])
result_broadcast = array_2d + np.array([1, 2, 3])
print("广播加法结果:\n", result_broadcast)

NumPy的线性代数

NumPy 提供了丰富的线性代数功能,可以进行矩阵乘法、求逆等操作。

1
2
3
4
5
6
7
8
9
10
11
# 矩阵的创建
matrix_a = np.array([[1, 2], [3, 4]])
matrix_b = np.array([[5, 6], [7, 8]])

# 矩阵乘法
matrix_product = np.dot(matrix_a, matrix_b)
print("矩阵乘法结果:\n", matrix_product)

# 矩阵求逆
inverse_matrix = np.linalg.inv(matrix_a)
print("矩阵的逆:\n", inverse_matrix)

保存与加载数组

NumPy 可以方便地保存和加载数组,支持多种格式。

1
2
3
4
5
6
7
8
9
# 创建数组
array = np.array([[1, 2, 3], [4, 5, 6]])

# 保存数组到文件
np.save('array.npy', array)

# 加载数组
loaded_array = np.load('array.npy')
print("加载的数组:\n", loaded_array)

这些实例展示了 NumPy 在科学计算和数据分析中的强大功能。通过深入理解和实践这些操作,你将能够在数据处理和分析中更加得心应手。

18 加载数据

18 加载数据

在数据分析和科学计算中,加载数据是至关重要的一步。NumPy 提供了多种方式来加载数据,包括从文本文件、CSV 文件、以及其他格式的数据文件。下面我们将逐步介绍如何使用 NumPy 加载数据,并附上具体案例和代码示例。

从文本文件加载数据

NumPy 提供了 numpy.loadtxt() 函数,可以方便地从文本文件中加载数据。假设我们有一个名为 data.txt 的文本文件,其内容如下:

1
2
3
1.0 2.0 3.0
4.0 5.0 6.0
7.0 8.0 9.0

示例代码

1
2
3
4
5
6
import numpy as np

# 从 text 文件中加载数据
data = np.loadtxt('data.txt')

print(data)

输出结果

1
2
3
[[1. 2. 3.]
[4. 5. 6.]
[7. 8. 9.]]

在这个示例中,numpy.loadtxt() 函数将文本文件中的数据加载为一个 NumPy 数组。数字间的空格被自动识别为分隔符。

从 CSV 文件加载数据

NumPy 也支持从 CSV 文件中加载数据。假设我们有一个名为 data.csv 的文件,其内容如下:

1
2
3
1.0,2.0,3.0
4.0,5.0,6.0
7.0,8.0,9.0

示例代码

1
2
3
4
5
6
import numpy as np

# 从 CSV 文件中加载数据
data = np.loadtxt('data.csv', delimiter=',')

print(data)

输出结果

1
2
3
[[1. 2. 3.]
[4. 5. 6.]
[7. 8. 9.]]

在这个示例中,加载 CSV 文件时,通过设置 delimiter=',' 指定了逗号作为分隔符。

从 Excel 文件加载数据

直接从 Excel 文件加载数据可以利用 pandas 库。虽然此时并非直接使用 NumPy,但通常我们需要先加载数据,然后将其转换为 NumPy 数组。

示例代码

确保你已安装 pandas

1
pip install pandas

假设你有一个名为 data.xlsx 的 Excel 文件。

1
2
3
4
5
6
7
8
import pandas as pd
import numpy as np

# 从 Excel 文件加载数据
df = pd.read_excel('data.xlsx')
data = df.to_numpy()

print(data)

输出结果

假设你的 Excel 文件中数据与之前相同,输出将为:

1
2
3
[[1. 2. 3.]
[4. 5. 6.]
[7. 8. 9.]]

在这个示例中,使用 pandasread_excel() 方法读取 Excel 文件,然后使用 to_numpy() 方法将数据转换为 NumPy 数组。

总结

NumPy 提供了简便的加载数据方式,无论是文本文件、CSV 还是 Excel 文件,都可以通过相关函数轻松实现。掌握这些加载数据的方法将为后续的科学计算和数据分析打下坚实的基础。