目录
1. np.reshape
np.reshape
可以在不改变数组数据的前提下改变数组的形状。
import numpy as np
a = np.arange(6) # 创建一个包含6个元素的数组
print(a)
# 输出: [0 1 2 3 4 5]
b = np.reshape(a, (2, 3)) # 改变数组形状为2行3列
print(b)
# 输出:
# [[0 1 2]
# [3 4 5]]
特点:
- 不改变数组的数据。
- 必须保证新的形状与原始数组的总元素数相匹配。
- 返回的是视图(如果可能),所以改变结果数组也可能改变原数组。
2. np.resize
.resize
可以改变数组的形状并且改变了原数组。
a = np.arange(6)
a.resize((2, 3))
print(a)
# 输出:
# [[0 1 2]
# [3 4 5]]
特点:
- 直接在原数组上进行操作,不返回新数组。
- 如果新形状大于原始形状,会自动填充零。
- 如果新形状小于原始形状,会丢弃多余的数据。
3. np.flatten
和 np.ravel
.flatten
和 .ravel
能将多维数组降为一维。
a = np.array([[1, 2, 3], [4, 5, 6]])
b = a.flatten() # 返回一个拷贝
c = a.ravel() # 返回一个视图
# b 和 c 的输出相同,但修改 b 不会改变 a,修改 c 可能会改变 a
特点:
.flatten()
返回数组的一维副本,即使修改了副本,也不会影响原始数组。.ravel()
返回数组的一维视图,修改视图可能会改变原始数据。
4. np.squeeze
.squeeze
方法用于移除数组形状中的单维度条目,即维数为1的维度。
a = np.array([[[1, 2, 3]]])
print(a.shape) # 输出: (1, 1, 3)
b = np.squeeze(a)
print(b.shape) # 输出: (3,)
特点:
- 只能移除长度为1的维度。
- 返回的是原数组的视图,所以修改后可能会影响原数组。
5. np.expand_dims
np.expand_dims
用于在指定位置插入一个新的轴来增加数组的维数。
a = np.array([1, 2, 3])
print(a.shape) # 输出: (3,)
b = np.expand_dims(a, axis=0)
print(b.shape) # 输出: (1, 3)
特点:
- 用于增加数组的维度。
- 返回原数组的视图。
注:在 NumPy 中,并没有一个名为 np.unsqueeze
的函数。扩充维度用 np.expand_dims
函数
6. np.transpose
np.transpose
是 NumPy 中用于转置数组的函数,也就是说,它可以改变数组的轴的顺序。对于二维数组,它会交换行和列,而对于多维数组,它可以重新排列轴的顺序。
对于二维数组,np.transpose
无需指定任何额外参数即可交换行和列:
import numpy as np
a = np.array([[1, 2], [3, 4], [5, 6]])
b = np.transpose(a)
print(b)
# 输出:
# [[1 3 5]
# [2 4 6]]
对于高维数组,np.transpose
可以接受一个轴编号的元组,指定轴的新顺序:
a = np.array([[[ 1, 2, 3],
[ 4, 5, 6]],
[[ 7, 8, 9],
[10, 11, 12]]])
b = np.transpose(a, (1, 0, 2))
print(b)
# 输出:
# [[[ 1 2 3]
# [ 7 8 9]]
#
# [[ 4 5 6]
# [10 11 12]]]
在这个例子中,原来的轴顺序是(0, 1, 2),np.transpose
的参数 (1, 0, 2)
表示第一个轴和第二个轴交换了位置。
特点
np.transpose
不仅可以用于二维矩阵的转置,还可以处理任意维度的数组。- 转置操作返回的是原数组的一个新视图,而不复制数据。这意味着转置后的数组与原数组共享相同的数据缓冲区,修改其中一个可能会影响另一个。
- 对于两维数组,
.T
属性是转置操作的一个快捷方式:
b = a.T # 等同于 np.transpose(a)
这些方法各有特点和适用场景。.reshape
和 .resize
适用于改变数组的多维形状,而 .flatten
和 .ravel
适用于将多维数组降成一维。.squeeze
用于移除多余的轴(维度为1的),而 .expand_dims
用于增加额外的轴。通常情况下,.reshape
是最常用的改变数组形状的方法。