NumPy 数组 的形状可以通过多种方式改变。其中,将多维数组转换为一维数组是 NumPy 数组操作中常见的需求。
NumPy 提供了多种将多维数组转换为一维数组的方式,常用的如下表所示。
| 方式 | 说明 |
|---|---|
| ndarray.flatten()(这是一个方法) | 返回一份数组拷贝,原始数组不变 |
| ndarray.ravel()(这是一个方法) | 返回展开数组 |
| ndarray.reshape()(这是一个方法) | 改变数组的形状 |
| numpy.reshape()(这是一个函数) | 改变数组的形状 |
使用 ndarray.flatten()
在 NumPy 中,我们可以使用 ndarray.flatten() 方法将多维数组转换为一维数组。
语法:
ndarray.flatten()说明:
flatten() 是数组对象(即 ndarray 对象)的一个方法,它会返回一个新的一维数组,这个数组是原始数组的拷贝,而不是视图。也就是说,对返回的数组进行修改不会影响原始数组。
示例 1:ndarray.flatten() 改变维度
import numpy as np
arr1 = np.array([[1, 2, 3], [4, 5, 6]]) # 创建一个二维数组
arr2 = arr1.flatten() # 将二维数组转换为一维数组
print(arr1)
print(arr2)
arr2[0] = 100
print(arr1)
print(arr2)运行结果如下。
[[1 2 3]
[4 5 6]]
[1 2 3 4 5 6]
[[1 2 3]
[4 5 6]]
[100 2 3 4 5 6]分析:
在这个例子中,我们首先使用了 np.array() 来创建一个二维数组。从结果可以看出,修改 flatten() 返回的数组并不会影响原数组,即修改 arr2 并不会影响 arr1。
使用 ndarray.ravel()
在 NumPy 中,我们还可以使用 ndarray.ravel() 方法将多维数组转换为一维数组。
语法:
ndarray.ravel()说明:
ravel() 是数组对象(即 ndarray 对象)的一个方法,用于返回一个展开后的一维数组。通常情况下,ravel() 返回的是原始数组的视图(view),这意味着修改返回的数组可能会影响原始数组。
示例 2:ndarray.ravel() 改变维度
import numpy as np
arr1 = np.array([[1, 2, 3], [4, 5, 6]]) # 创建一个二维数组
arr2 = arr1.ravel() # 将二维数组转换为一维数组
print(arr1)
print(arr2)
arr2[0] = 100
print(arr1)
print(arr2)运行结果如下。
[[1 2 3]
[4 5 6]]
[1 2 3 4 5 6]
[[100 2 3]
[ 4 5 6]]
[100 2 3 4 5 6]分析:
从结果可以看出,修改 ravel() 返回的数组会影响原数组,即修改 arr2 会影响 arr1。
使用 ndarray.reshape()
在 NumPy 中,我们还可以使用 ndarray.reshape() 方法来改变数组的形状,从而将多维数组转换为一维数组。
语法:
ndarray.reshape(newshape)说明:
ndarray.reshape() 方法是数组对象(即 ndarray 对象)的一个方法,用于返回指定形状的新数组。
参数 newshape 用于指定新的形状,它是一个元组,比如 (行数, 列数)。当 newshape 中的一个维度指定为 -1 时,将自动计算该维度的大小。
示例 3:ndarray.reshape() 改变维度
import numpy as np
arr1 = np.array([[1, 2, 3], [4, 5, 6]]) # 创建一个二维数组
arr2 = arr1.reshape((6,)) # 将二维数组转换为一维数组
print(arr1)
print(arr2)运行结果如下。
[[1 2 3]
[4 5 6]]
[1 2 3 4 5 6]分析:
arr1.reshape((6,)) 表示将二维数组 arr1 转换为了一个包含 6 个元素的一维数组 arr2。
使用 numpy.reshape()
在 NumPy 中,我们可以使用 numpy.reshape() 函数来改变数组的形状,从而将多维数组转换为一维数组。
语法:
numpy.reshape(arr, newshape)说明:
numpy.reshape() 函数接收以下 2 个参数。
arr:需要改变形状的数组。newshape:新的形状,是一个元组,比如(行数, 列数)。当 newshape 中的一个维度指定为 -1 时,将自动计算该维度的大小。
提示: ndarray.reshape() 是一个方法,它是 ndarray 对象的方法。而 numpy.reshape() 是一个函数,它是 numpy 包的一个函数。注意,方法和函数是不一样的。
示例 4:numpy.reshape() 改变维度
import numpy as np
arr1 = np.array([[1, 2, 3], [4, 5, 6]]) # 创建一个二维数组
arr2 = np.reshape(arr1, (6,)) # 将二维数组转换为一维数组
print(arr1)
print(arr2)运行结果如下。
[[1 2 3]
[4 5 6]]
[1 2 3 4 5 6]分析:
numpy.reshape(arr1, (6,)) 表示将二维数组 arr1 转换为了一个包含 6 个元素的一维数组 arr2,效果与 arr1.reshape((6,)) 相同。
示例 5:newshape 指定为 -1
import numpy as np
arr1 = np.array([[1, 2, 3], [4, 5, 6]]) # 创建一个二维数组
# 使用 -1 自动推断长度
arr2 = arr1.reshape(-1) # 将二维数组转换为一维数组
print(arr1)
print(arr2)运行结果如下。
[[1 2 3]
[4 5 6]]
[1 2 3 4 5 6]分析:
使用 -1 会自动推断长度,这是一个使用极高频的 “打平” 操作。
