第九章:NumPy 数组的合并与分割


文档摘要

第九章:NumPy 数组的合并与分割 第九章:NumPy 数组的合并与分割 9.1 数组的合并 数组的合并是指将两个或多个数组组合成一个更大的数组。NumPy 提供了以下函数来实现数组的合并: : 沿指定的轴连接数组序列。 : 沿新的轴连接数组序列。 : 水平(按列)堆叠数组。 : 垂直(按行)堆叠数组。 : 沿深度方向(第三个轴)堆叠数组。 9.1.1 函数是最通用的数组合并函数,它允许你指定连接的轴。 语法: : 要连接的数组序列。 : 连接的轴。默认为 0,表示沿第一个轴(行)连接。 : 可选参数,用于指定结果数组。 示例: 注意事项: 要连接的数组必须具有相同的形状,除了连接轴的维度外。 如果 超出数组的维度范围,则会引发错误。 9.1.2 函数沿新的轴连接数组序列。

第九章:NumPy 数组的合并与分割

第九章:NumPy 数组的合并与分割

9.1 数组的合并

数组的合并是指将两个或多个数组组合成一个更大的数组。NumPy 提供了以下函数来实现数组的合并:

  • np.concatenate(): 沿指定的轴连接数组序列。

  • np.stack(): 沿新的轴连接数组序列。

  • np.hstack(): 水平(按列)堆叠数组。

  • np.vstack(): 垂直(按行)堆叠数组。

  • np.dstack(): 沿深度方向(第三个轴)堆叠数组。

9.1.1 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 超出数组的维度范围,则会引发错误。

9.1.2 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 是数组的维度。

9.1.3 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]]]

9.1.4 合并操作流程图

9.2 数组的分割

数组的分割是指将一个数组分割成多个较小的数组。NumPy 提供了以下函数来实现数组的分割:

  • np.split(): 将数组分割成多个子数组。

  • np.array_split(): 类似于 np.split(),但允许分割成大小不等的子数组。

  • np.hsplit(): 水平(按列)分割数组。

  • np.vsplit(): 垂直(按行)分割数组。

  • np.dsplit(): 沿深度方向分割数组。

9.2.1 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 整除。否则,会引发错误。

9.2.2 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() 允许分割成大小不等的子数组。

9.2.3 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)

9.2.4 分割操作流程图

9.3 总结

本章介绍了 NumPy 中用于数组合并与分割的函数。np.concatenate()np.stack() 是通用的合并函数,而 np.hstack()np.vstack()np.dstack() 是它们的简化版本。np.split()np.array_split() 用于分割数组,而 np.hsplit()np.vsplit()np.dsplit() 是它们的简化版本。 掌握这些函数可以有效地处理和操作 NumPy 数组,从而更好地进行数据分析和科学计算。在选择使用哪个函数时,需要根据实际需求和数组的形状来决定。 理解这些函数的差异和适用场景对于高效地使用 NumPy 至关重要。


发布者: 作者: 转发
评论区 (0)
U