8.4 数组的维度扩展和压缩


文档摘要

8.4 数组的维度扩展和压缩 NumPy 数组的维度扩展和压缩 8.4.1 维度扩展 维度扩展是指增加数组的维度,以便更好地匹配其他数组的形状,或满足特定算法的要求。NumPy 提供了两种主要的维度扩展方法: 和 。 1. 实际上不是一个函数,而是一个常量,它可以用来在指定位置插入一个新的轴。 代码解释: 在第一个维度(行)上插入一个新的轴,将一维数组转换为二维行向量。 在第二个维度(列)上插入一个新的轴,将一维数组转换为二维列向量。 mermaid Graph TD 图示: 2. 函数允许我们在指定的轴位置插入一个新的轴。 代码解释: 在轴 0 (最外层) 上插入一个新的轴。 在轴 1 上插入一个新的轴。 对于二维数组, 在最外层插入轴, 在行和列之间插入轴。

8.4 数组的维度扩展和压缩

NumPy 数组的维度扩展和压缩

8.4.1 维度扩展

维度扩展是指增加数组的维度,以便更好地匹配其他数组的形状,或满足特定算法的要求。NumPy 提供了两种主要的维度扩展方法:np.newaxisnp.expand_dims()

1. np.newaxis

np.newaxis 实际上不是一个函数,而是一个常量,它可以用来在指定位置插入一个新的轴。

import numpy as np # 创建一个一维数组 arr = np.array([1, 2, 3, 4, 5]) print("原始数组:", arr) print("原始数组形状:", arr.shape) # 使用 np.newaxis 将其转换为一个行向量 row_vector = arr[np.newaxis, :] print("行向量:", row_vector) print("行向量形状:", row_vector.shape) # 使用 np.newaxis 将其转换为一个列向量 col_vector = arr[:, np.newaxis] print("列向量:", col_vector) print("列向量形状:", col_vector.shape)

代码解释:

  • arr[np.newaxis, :] 在第一个维度(行)上插入一个新的轴,将一维数组转换为二维行向量。

  • arr[:, np.newaxis] 在第二个维度(列)上插入一个新的轴,将一维数组转换为二维列向量。

mermaid Graph TD 图示:

2. np.expand_dims()

np.expand_dims() 函数允许我们在指定的轴位置插入一个新的轴。

import numpy as np # 创建一个一维数组 arr = np.array([1, 2, 3, 4, 5]) print("原始数组:", arr) print("原始数组形状:", arr.shape) # 在轴 0 上扩展维度 expanded_arr_0 = np.expand_dims(arr, axis=0) print("轴 0 扩展:", expanded_arr_0) print("轴 0 扩展形状:", expanded_arr_0.shape) # 在轴 1 上扩展维度 expanded_arr_1 = np.expand_dims(arr, axis=1) print("轴 1 扩展:", expanded_arr_1) print("轴 1 扩展形状:", expanded_arr_1.shape) # 创建一个二维数组 arr2d = np.array([[1, 2], [3, 4]]) print("原始二维数组:", arr2d) print("原始二维数组形状:", arr2d.shape) # 在轴 0 上扩展维度 expanded_arr2d_0 = np.expand_dims(arr2d, axis=0) print("二维数组轴 0 扩展:", expanded_arr2d_0) print("二维数组轴 0 扩展形状:", expanded_arr2d_0.shape) # 在轴 1 上扩展维度 expanded_arr2d_1 = np.expand_dims(arr2d, axis=1) print("二维数组轴 1 扩展:", expanded_arr2d_1) print("二维数组轴 1 扩展形状:", expanded_arr2d_1.shape)

代码解释:

  • np.expand_dims(arr, axis=0) 在轴 0 (最外层) 上插入一个新的轴。

  • np.expand_dims(arr, axis=1) 在轴 1 上插入一个新的轴。

  • 对于二维数组,axis=0 在最外层插入轴,axis=1 在行和列之间插入轴。

np.newaxis vs np.expand_dims():

  • np.newaxis 使用起来更简洁,但可读性可能稍差。

  • np.expand_dims() 更明确地指定了要插入轴的位置,更易于理解。

  • 两者在功能上是等价的,可以根据个人偏好选择使用。

应用场景:

  • 广播机制: 维度扩展常用于 NumPy 的广播机制,使得形状不匹配的数组可以进行运算。

  • 模型输入: 神经网络模型通常需要特定形状的输入数据,维度扩展可以帮助调整数据形状。

  • 数据可视化: 有时需要扩展维度来满足可视化库的要求。

8.4.2 维度压缩

维度压缩是指移除数组中大小为 1 的维度。这可以简化数组的形状,提高内存利用率,并方便后续处理。 NumPy 提供了 np.squeeze() 函数来实现维度压缩。

np.squeeze()

np.squeeze() 函数可以移除数组中所有大小为 1 的维度,或者只移除指定的轴上的大小为 1 的维度。

import numpy as np # 创建一个形状为 (1, 5, 1, 3) 的数组 arr = np.random.rand(1, 5, 1, 3) print("原始数组:", arr) print("原始数组形状:", arr.shape) # 移除所有大小为 1 的维度 squeezed_arr = np.squeeze(arr) print("压缩后的数组:", squeezed_arr) print("压缩后的数组形状:", squeezed_arr.shape) # 指定要压缩的轴 squeezed_arr_0 = np.squeeze(arr, axis=0) print("压缩轴 0 后的数组:", squeezed_arr_0) print("压缩轴 0 后的数组形状:", squeezed_arr_0.shape) squeezed_arr_2 = np.squeeze(arr, axis=2) print("压缩轴 2 后的数组:", squeezed_arr_2) print("压缩轴 2 后的数组形状:", squeezed_arr_2.shape) # 如果指定的轴大小不为 1,则不会进行压缩 squeezed_arr_1 = np.squeeze(arr, axis=1) print("尝试压缩轴 1 后的数组:", squeezed_arr_1) print("尝试压缩轴 1 后的数组形状:", squeezed_arr_1.shape)

代码解释:

  • np.squeeze(arr) 移除数组 arr 中所有大小为 1 的维度。

  • np.squeeze(arr, axis=0) 只移除轴 0 上大小为 1 的维度。

  • 如果指定的轴的大小不为 1,则 np.squeeze() 不会进行任何操作。

mermaid Graph TD 图示:

应用场景:

  • 清理数据: 当数组包含不必要的维度时,可以使用 np.squeeze() 进行清理。

  • 简化计算: 移除大小为 1 的维度可以简化后续的计算过程。

  • 匹配形状: 有时需要压缩维度来匹配其他数组的形状,以便进行运算。

8.4.3 维度扩展和压缩的组合应用

维度扩展和压缩可以结合使用,以实现更灵活的数组形状操作。

import numpy as np # 创建一个一维数组 arr = np.array([1, 2, 3, 4, 5]) print("原始数组:", arr) print("原始数组形状:", arr.shape) # 先扩展维度,再压缩维度 expanded_arr = np.expand_dims(arr, axis=0) print("扩展后的数组:", expanded_arr) print("扩展后的数组形状:", expanded_arr.shape) squeezed_arr = np.squeeze(expanded_arr) print("压缩后的数组:", squeezed_arr) print("压缩后的数组形状:", squeezed_arr.shape) # 实际上,扩展后再压缩,数组形状不会改变 print("原始数组和压缩后的数组是否相等:", np.array_equal(arr, squeezed_arr))

代码解释:

这个例子演示了先使用 np.expand_dims() 扩展数组的维度,然后再使用 np.squeeze() 压缩维度。 在这种情况下,扩展后再压缩,数组的形状不会改变,因为 np.squeeze() 会移除所有大小为 1 的维度,而 np.expand_dims() 只是插入了一个大小为 1 的维度。

更复杂的例子:

假设我们有一个形状为 (10, 1, 28, 28) 的数组,表示 10 张 28x28 的灰度图像,其中第 2 个维度的大小为 1,表示单通道。我们可以先压缩这个维度,然后再扩展维度,以便与其他形状的数组进行运算。

import numpy as np # 创建一个形状为 (10, 1, 28, 28) 的数组 images = np.random.rand(10, 1, 28, 28) print("原始图像数组形状:", images.shape) # 压缩通道维度 squeezed_images = np.squeeze(images, axis=1) print("压缩后的图像数组形状:", squeezed_images.shape) # 扩展维度,以便进行广播运算 expanded_images = np.expand_dims(squeezed_images, axis=3) print("扩展后的图像数组形状:", expanded_images.shape)

总结:

np.newaxisnp.expand_dims() 用于增加数组的维度,而 np.squeeze() 用于移除数组中大小为 1 的维度。 它们是 NumPy 中非常重要的数组操作函数,可以帮助我们灵活地调整数组的形状,以满足不同的计算和数据表示需求。 熟练掌握这些函数,可以有效地提高数据处理的效率和代码的可读性。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U