第九章:NumPy 数组的合并与分割 第九章:NumPy 数组的合并与分割 9.1 数组的合并 数组的合并是指将两个或多个数组组合成一个更大的数组。NumPy 提供了以下函数来实现数组的合并: : 沿指定的轴连接数组序列。 : 沿新的轴连接数组序列。 : 水平(按列)堆叠数组。 : 垂直(按行)堆叠数组。 : 沿深度方向(第三个轴)堆叠数组。 9.1.1 函数是最通用的数组合并函数,它允许你指定连接的轴。 语法: : 要连接的数组序列。 : 连接的轴。默认为 0,表示沿第一个轴(行)连接。 : 可选参数,用于指定结果数组。 示例: 注意事项: 要连接的数组必须具有相同的形状,除了连接轴的维度外。 如果 超出数组的维度范围,则会引发错误。 9.1.2 函数沿新的轴连接数组序列。
数组的合并是指将两个或多个数组组合成一个更大的数组。NumPy 提供了以下函数来实现数组的合并:
np.concatenate(): 沿指定的轴连接数组序列。
np.stack(): 沿新的轴连接数组序列。
np.hstack(): 水平(按列)堆叠数组。
np.vstack(): 垂直(按行)堆叠数组。
np.dstack(): 沿深度方向(第三个轴)堆叠数组。
np.concatenate()np.concatenate() 函数是最通用的数组合并函数,它允许你指定连接的轴。
语法:
np.concatenate((a1, a2, ...), axis=0, out=None)
a1, a2, ...: 要连接的数组序列。
axis: 连接的轴。默认为 0,表示沿第一个轴(行)连接。
out: 可选参数,用于指定结果数组。
示例:
import numpy as np a = np.array([[1, 2], [3, 4]]) b = np.array([[5, 6]]) # 沿 axis=0 连接 (行连接) c = np.concatenate((a, b), axis=0) print("沿 axis=0 连接:\n", c) # 输出: # 沿 axis=0 连接: # [[1 2] # [3 4] # [5 6]] # 沿 axis=1 连接 (列连接) d = np.concatenate((a, np.array([[5,6],[7,8]])), axis=1) print("沿 axis=1 连接:\n", d) # 输出: # 沿 axis=1 连接: # [[1 2 5 6] # [3 4 7 8]]
注意事项:
要连接的数组必须具有相同的形状,除了连接轴的维度外。
如果 axis 超出数组的维度范围,则会引发错误。
np.stack()np.stack() 函数沿新的轴连接数组序列。这意味着它会在结果数组中创建一个新的维度。
语法:
np.stack((a1, a2, ...), axis=0, out=None)
a1, a2, ...: 要连接的数组序列。
axis: 新轴的索引。默认为 0,表示在第一个位置插入新轴。
out: 可选参数,用于指定结果数组。
示例:
import numpy as np a = np.array([1, 2, 3]) b = np.array([4, 5, 6]) # 沿 axis=0 堆叠 c = np.stack((a, b), axis=0) print("沿 axis=0 堆叠:\n", c) # 输出: # 沿 axis=0 堆叠: # [[1 2 3] # [4 5 6]] # 沿 axis=1 堆叠 d = np.stack((a, b), axis=1) print("沿 axis=1 堆叠:\n", d) # 输出: # 沿 axis=1 堆叠: # [[1 4] # [2 5] # [3 6]]
注意事项:
要堆叠的数组必须具有相同的形状。
axis 的取值范围为 [-ndim-1, ndim],其中 ndim 是数组的维度。
np.hstack()、np.vstack() 和 np.dstack()这些函数是 np.concatenate() 和 np.stack() 的简化版本,分别用于水平、垂直和深度方向的堆叠。
np.hstack(tup) 等价于 np.concatenate(tup, axis=1),除了当数组是一维时,np.hstack() 沿第一个轴堆叠。
np.vstack(tup) 等价于 np.concatenate(tup, axis=0)。
np.dstack(tup) 沿深度方向堆叠数组(沿第三个轴)。
示例:
import numpy as np a = np.array([1, 2, 3]) b = np.array([4, 5, 6]) # 水平堆叠 c = np.hstack((a, b)) print("水平堆叠:\n", c) # 输出: # 水平堆叠: # [1 2 3 4 5 6] # 垂直堆叠 d = np.vstack((a, b)) print("垂直堆叠:\n", d) # 输出: # 垂直堆叠: # [[1 2 3] # [4 5 6]] a = np.array([[1], [2], [3]]) b = np.array([[4], [5], [6]]) # 深度堆叠 e = np.dstack((a, b)) print("深度堆叠:\n", e) # 输出: # 深度堆叠: # [[[1 4] # [2 5] # [3 6]]]
数组的分割是指将一个数组分割成多个较小的数组。NumPy 提供了以下函数来实现数组的分割:
np.split(): 将数组分割成多个子数组。
np.array_split(): 类似于 np.split(),但允许分割成大小不等的子数组。
np.hsplit(): 水平(按列)分割数组。
np.vsplit(): 垂直(按行)分割数组。
np.dsplit(): 沿深度方向分割数组。
np.split()np.split() 函数将数组分割成多个子数组。
语法:
np.split(ary, indices_or_sections, axis=0)
ary: 要分割的数组。
indices_or_sections: 如果是一个整数,则表示要分割成多少个子数组。如果是一个数组,则表示分割点的位置。
axis: 分割的轴。默认为 0,表示沿第一个轴(行)分割。
示例:
import numpy as np a = np.array([1, 2, 3, 4, 5, 6]) # 分割成 3 个子数组 b = np.split(a, 3) print("分割成 3 个子数组:\n", b) # 输出: # 分割成 3 个子数组: # [array([1, 2]), array([3, 4]), array([5, 6])] # 在索引 2 和 4 处分割 c = np.split(a, [2, 4]) print("在索引 2 和 4 处分割:\n", c) # 输出: # 在索引 2 和 4 处分割: # [array([1, 2]), array([3, 4]), array([5, 6])] a = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]) # 沿 axis=1 分割成 2 个子数组 d = np.split(a, 2, axis=1) print("沿 axis=1 分割成 2 个子数组:\n", d) # 输出: # 沿 axis=1 分割成 2 个子数组: # [array([[ 1, 2], # [ 5, 6], # [ 9, 10]]), array([[ 3, 4], # [ 7, 8], # [11, 12]])]
注意事项:
indices_or_sections 是一个整数 n,则数组的长度必须能被 n 整除。否则,会引发错误。np.array_split()np.array_split() 函数类似于 np.split(),但允许分割成大小不等的子数组。
语法:
np.array_split(ary, indices_or_sections, axis=0)
ary: 要分割的数组。
indices_or_sections: 如果是一个整数,则表示要分割成多少个子数组。如果是一个数组,则表示分割点的位置。
axis: 分割的轴。默认为 0,表示沿第一个轴(行)分割。
示例:
import numpy as np a = np.array([1, 2, 3, 4, 5]) # 分割成 3 个子数组 b = np.array_split(a, 3) print("分割成 3 个子数组:\n", b) # 输出: # 分割成 3 个子数组: # [array([1, 2]), array([3, 4]), array([5])]
注意事项:
np.split() 不同,np.array_split() 允许分割成大小不等的子数组。np.hsplit()、np.vsplit() 和 np.dsplit()这些函数是 np.split() 的简化版本,分别用于水平、垂直和深度方向的分割。
np.hsplit(ary, indices_or_sections) 等价于 np.split(ary, indices_or_sections, axis=1)。
np.vsplit(ary, indices_or_sections) 等价于 np.split(ary, indices_or_sections, axis=0)。
np.dsplit(ary, indices_or_sections) 沿深度方向分割数组(沿第三个轴)。
示例:
import numpy as np a = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]) # 水平分割成 2 个子数组 b = np.hsplit(a, 2) print("水平分割成 2 个子数组:\n", b) # 输出: # 水平分割成 2 个子数组: # [array([[ 1, 2], # [ 5, 6], # [ 9, 10]]), array([[ 3, 4], # [ 7, 8], # [11, 12]])] # 垂直分割成 3 个子数组 c = np.vsplit(a, 3) print("垂直分割成 3 个子数组:\n", c) # 输出: # 垂直分割成 3 个子数组: # [array([[1, 2, 3, 4]]), array([[5, 6, 7, 8]]), array([[ 9, 10, 11, 12]])] a = np.arange(27).reshape(3, 3, 3) # 深度分割成 3 个子数组 d = np.dsplit(a, 3) print("深度分割成 3 个子数组:\n", d)
本章介绍了 NumPy 中用于数组合并与分割的函数。np.concatenate() 和 np.stack() 是通用的合并函数,而 np.hstack()、np.vstack() 和 np.dstack() 是它们的简化版本。np.split() 和 np.array_split() 用于分割数组,而 np.hsplit()、np.vsplit() 和 np.dsplit() 是它们的简化版本。 掌握这些函数可以有效地处理和操作 NumPy 数组,从而更好地进行数据分析和科学计算。在选择使用哪个函数时,需要根据实际需求和数组的形状来决定。 理解这些函数的差异和适用场景对于高效地使用 NumPy 至关重要。