numpy教程:numpy的数组形状操作

Numpy 提供了多种数组形状操作,用于查看、修改数组的形状(即数组的维度)。这些操作包括查看数组的形状、改变形状、展平数组、增加或减少数组的维度等。下面详细介绍常用的数组形状操作,并通过实例说明如何使用它们。

1. 查看数组形状:shape 属性

Numpy 数组的 shape 属性返回数组的形状,显示每一维的大小。

示例:
import numpy as np

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

# 查看数组的形状
print(arr.shape)

输出

(2, 3)

这里,数组 arr 的形状是 (2, 3),表示它有 2 行和 3 列。

2. 改变数组形状:reshape()

reshape() 函数用于改变数组的形状,但不改变其数据。数组的总元素个数必须保持一致。

示例:
# 创建一个一维数组
arr = np.array([1, 2, 3, 4, 5, 6])

# 将一维数组转换为二维数组,形状为 (2, 3)
reshaped_arr = arr.reshape((2, 3))
print(reshaped_arr)

输出

[[1 2 3]
 [4 5 6]]

reshape() 将一维数组 arr 转换成了二维数组,形状为 (2, 3)

重要提示:

如果你试图将数组形状改成一个与元素数量不匹配的形状,Numpy 会抛出错误。

# 错误示例:元素个数不匹配
# arr.reshape((3, 3))  # 会引发错误,因为数组的元素总数为 6,无法重塑为 (3, 3)

3. 展平数组:ravel()flatten()

这两个函数都可以将多维数组展平成一维数组,但它们之间有细微差异:

  • ravel():返回的是原数组的视图(view),如果对展平后的数组进行修改,原数组也会随之改变(除非数组存储不连续)。
  • flatten():返回的是原数组的副本,修改展平后的数组不会影响原数组。
示例:
# 创建一个二维数组
arr = np.array([[1, 2, 3], [4, 5, 6]])

# 使用 ravel 展平
ravel_arr = arr.ravel()
print("Ravel:", ravel_arr)

# 使用 flatten 展平
flatten_arr = arr.flatten()
print("Flatten:", flatten_arr)

输出

Ravel: [1 2 3 4 5 6]
Flatten: [1 2 3 4 5 6]

两者的输出看似相同,但 ravel() 返回的是视图,而 flatten() 返回的是副本。

4. 转置数组:transpose().T

transpose().T 属性用于交换数组的轴,即转置数组。对于二维数组,转置是行列互换。

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

# 使用 transpose() 进行转置
transposed_arr = arr.transpose()
print("Transposed array using transpose():\n", transposed_arr)

# 使用 .T 进行转置
transposed_arr_T = arr.T
print("Transposed array using .T:\n", transposed_arr_T)

输出

Transposed array using transpose():
 [[1 4]
 [2 5]
 [3 6]]
Transposed array using .T:
 [[1 4]
 [2 5]
 [3 6]]

5. 增加或减少维度:expand_dims()squeeze()

  • expand_dims():用于在指定位置插入一个新的维度。
  • squeeze():用于移除数组中的单维(即大小为 1 的维度)。
示例:增加维度
# 创建一个一维数组
arr = np.array([1, 2, 3])

# 在第 0 轴增加一个维度
expanded_arr = np.expand_dims(arr, axis=0)
print("Expanded array:\n", expanded_arr)
print("Shape after expanding:", expanded_arr.shape)

输出

Expanded array:
 [[1 2 3]]
Shape after expanding: (1, 3)
示例:减少维度
# 创建一个形状为 (1, 3, 1) 的三维数组
arr = np.array([[[1], [2], [3]]])

# 使用 squeeze() 移除所有大小为 1 的维度
squeezed_arr = np.squeeze(arr)
print("Squeezed array:", squeezed_arr)
print("Shape after squeezing:", squeezed_arr.shape)

输出

Squeezed array: [1 2 3]
Shape after squeezing: (3,)

6. 数组的形状重排:swapaxes()

swapaxes() 用于交换数组的两个指定轴。

示例:
# 创建一个三维数组
arr = np.array([[[1, 2, 3], [4, 5, 6]]])

# 交换第 0 轴和第 1 轴
swapped_arr = np.swapaxes(arr, 0, 1)
print("Swapped array:\n", swapped_arr)

输出

Swapped array:
 [[[1 2 3]]
  [[4 5 6]]]

7. 调整数组的维度:resize()

reshape() 类似,但 resize() 会直接修改数组自身,并且允许更改后的形状与原始数组的元素个数不匹配(会重复使用原数组的元素或截断多余的元素)。

示例:
# 创建一个一维数组
arr = np.array([1, 2, 3, 4])

# 使用 resize() 修改数组形状
arr.resize((2, 3))
print("Resized array:\n", arr)

输出

Resized array:
 [[1 2 3]
 [4 1 2]]

由于新的形状是 (2, 3),而原始数组只有 4 个元素,所以 resize() 会循环使用原数组的元素来填充新的形状。

总结:

  • 查看形状shape
  • 改变形状reshape()
  • 展平数组ravel()flatten()
  • 转置数组transpose().T
  • 增加维度expand_dims()
  • 减少维度squeeze()
  • 交换轴swapaxes()
  • 调整数组维度resize()

这些操作使得 Numpy 数组在处理数据时非常灵活,适用于不同形状的数据需求。

猜你喜欢

转载自blog.csdn.net/sunyuhua_keyboard/article/details/142988438