10 NumPy 数组索引与切片

10 NumPy 数组索引与切片

在使用 NumPy 进行科学计算时,数组的索引和切片是基本且重要的操作。本节将详细介绍如何使用索引和切片来优化数组的访问和操作。

数组索引

NumPy 数组支持多维索引,通过使用 [] 运算符可以访问数组的特定元素。索引是从 0 开始的。

示例

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

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

# 访问第一个元素
element = arr[0, 0] # 返回 1
print(element)

# 访问第二行第三列的元素
element = arr[1, 2] # 返回 6
print(element)

使用负索引

NumPy 也支持负索引。负索引从数组的末尾开始,-1 指向最后一个元素,-2 指向倒数第二个元素,依此类推。

1
2
3
# 访问最后一行的最后一个元素
element = arr[-1, -1] # 返回 9
print(element)

数组切片

切片让你可以访问数组的一部分,语法形式为 start:stop:step。其中,start 是起始索引,stop 是结束索引(不包括该位置),step 是步长。

一维数组切片

1
2
3
4
5
6
7
8
9
10
# 创建一个一维数组
arr1d = np.array([10, 20, 30, 40, 50])

# 切片访问前 3 个元素
slice1 = arr1d[0:3] # 返回 array([10, 20, 30])
print(slice1)

# 使用步长
slice2 = arr1d[::2] # 返回 array([10, 30, 50])
print(slice2)

二维数组切片

对于二维数组,切片可以分别为行和列进行定义。

1
2
3
4
5
6
7
# 切片访问前两行和前两列
slice3 = arr[0:2, 0:2] # 返回 array([[1, 2], [4, 5]])
print(slice3)

# 切片获取第二行及其之后的所有列
slice4 = arr[1:, :] # 返回 array([[4, 5, 6], [7, 8, 9]])
print(slice4)

高级切片

NumPy 支持使用 None 来增加维度,对切片的结果进行更灵活的管理。

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

# 增加一个维度
slice5 = arr1d[None, :] # 返回 array([[1, 2, 3, 4, 5]])
print(slice5)

# 访问多维数组的特定子数组
sub_array = arr[0:2, 1:3] # 返回 array([[2, 3], [5, 6]])
print(sub_array)

布尔索引

NumPy 还支持布尔索引,根据条件过滤数组中的元素。

1
2
3
4
# 根据条件筛选数组中的元素
filter_mask = arr > 5 # 创建一个布尔掩码
filtered_array = arr[filter_mask] # 返回 array([6, 7, 8, 9])
print(filtered_array)

结语

掌握 NumPy 数组的索引与切片是有效利用数组存储和处理数据的基础。通过灵活运用这些特性,可以极大提高程序的性能和可读性。

11 NumPy 数组重塑

11 NumPy 数组重塑

在数据处理与分析中,灵活地改变数组的形状是非常重要的。NumPy 提供了强大的数组重塑功能。我们将在本小节中探讨如何使用 NumPy 对数组进行重塑,并结合案例进行讲解。

数组重塑的基本概念

数组重塑是通过改变数组的形状来生成一个新的视图,依然共享原始数据。使用 NumPy 的 reshape 方法可以轻松实现这一点。重塑操作的总元素个数必须与原数组相同。

使用 reshape 方法

基本语法

数组重塑的基本语法为:

1
numpy.reshape(a, newshape)
  • a:输入数组。
  • newshape:新形状,可以是一个整数,也可以是一个元组,表示各维度的大小。

案例 1:基础重塑

下面是一个简单的案例,演示如何将一维数组重塑为二维数组:

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

# 创建一个包含 12 个元素的一维数组
array_1d = np.arange(12)
print("原始一维数组:", array_1d)

# 将其重塑为 3 行 4 列的二维数组
array_2d = array_1d.reshape((3, 4))
print("重塑后的二维数组:\n", array_2d)

输出结果:

1
2
3
4
5
原始一维数组: [ 0  1  2  3  4  5  6  7  8  9 10 11]
重塑后的二维数组:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]

案例 2:重塑为多维数组

我们还可以将数组重塑为更高维度的数组,例如三维数组:

1
2
3
# 将一维数组重塑为 2x2x3 的三维数组
array_3d = array_1d.reshape((2, 2, 3))
print("重塑后的三维数组:\n", array_3d)

输出结果:

1
2
3
4
5
6
重塑后的三维数组:
[[[ 0 1 2]
[ 3 4 5]]

[[ 6 7 8]
[ 9 10 11]]]

注意事项

  1. 元素个数一致:在进行重塑时,确保原始数组的元素数量与新形状的元素数量相同,否则会引发错误。
  2. -1 用法:在指定新形状时,可以使用 -1 自动计算某一维的大小。例如,如果你想要重塑为 4 行 n 列,可以写成 (-1, 4),NumPy 会自动推断 n 的大小。

案例 3:使用 -1 进行重塑

1
2
3
# 使用 -1 自动推断列数
array_auto = array_1d.reshape((-1, 4))
print("使用 -1 的重塑结果:\n", array_auto)

输出结果与案例 1 相同:

1
2
3
4
使用 -1 的重塑结果:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]

总结

数组重塑是 NumPy 中一个非常实用的功能,能够帮助我们灵活地操作数据。通过合理地运用 reshape 方法,我们可以轻松地在不同维度间转换数组形状。掌握这些基本操作将大大提升我们在数据科学与机器学习中的效率。

12 数组连接与分割

12 数组连接与分割

在使用 NumPy 进行数据处理时,数组的连接与分割是非常重要的操作。本节将详细介绍如何使用 NumPy 实现这些功能,并提供相应的代码示例。

数组连接

使用 np.concatenate

np.concatenate 函数可以沿着已有的轴连接多个数组。

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

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

# 沿着第一个轴(axis=0)连接数组
c = np.concatenate((a, b))
print(c) # 输出: [1 2 3 4 5 6]

使用 np.vstack

np.vstack 函数用于将多个数组按垂直方向(行方向)堆叠。

1
2
3
4
5
6
7
8
9
a = np.array([[1, 2, 3]])
b = np.array([[4, 5, 6]])

# 垂直堆叠
c = np.vstack((a, b))
print(c)
# 输出:
# [[1 2 3]
# [4 5 6]]

使用 np.hstack

np.hstack 函数用于将多个数组按水平方向(列方向)堆叠。

1
2
3
4
5
6
7
8
9
10
a = np.array([[1], [2], [3]])
b = np.array([[4], [5], [6]])

# 水平堆叠
c = np.hstack((a, b))
print(c)
# 输出:
# [[1 4]
# [2 5]
# [3 6]]

数组分割

使用 np.split

np.split 函数可以将数组沿指定的轴分割成多个子数组。

1
2
3
4
5
a = np.array([1, 2, 3, 4, 5, 6])

# 将数组分割成3个子数组
b = np.split(a, 3)
print(b) # 输出: [array([1, 2]), array([3, 4]), array([5, 6])]

使用 np.hsplit

np.hsplit 函数用于沿水平方向分割数组,通常用于二维数组。

1
2
3
4
5
6
7
8
9
a = np.array([[1, 2, 3], [4, 5, 6]])

# 水平分割成2个子数组
b = np.hsplit(a, 2)
print(b)
# 输出:
# [array([[1, 2],
# [4, 5]]), array([[3],
# [6]])]

使用 np.vsplit

np.vsplit 函数用于沿垂直方向分割数组。

1
2
3
4
5
6
7
a = np.array([[1, 2, 3], [4, 5, 6]])

# 垂直分割成2个子数组
b = np.vsplit(a, 2)
print(b)
# 输出:
# [array([[1, 2, 3]]), array([[4, 5, 6]])]

总结

本节讲述了如何使用 numpy 进行数组的连接和分割。通过 np.concatenatenp.vstacknp.hstacknp.splitnp.hsplitnp.vsplit 等函数,我们可以灵活地处理数组数据。在实际应用中,这些操作是数据预处理和分析中不可或缺的部分。