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 数组在处理数据时非常灵活,适用于不同形状的数据需求。