文章目录
前言
本篇总结、介绍Numpy数组(ndarray)的基本操作之一——改变数组维数 [1]。
1. atleast_1d、atleast_2d、atleast_3d
numpy.atleast_1d(*arys):将输入转换为维度至少为1的数组。如果输入为标量,则会被转换为一维数组,而更高维度的输入则保持不变
- arys1, arys2…:类数组
numpy.atleast_1d返回一个数组或多个数组组成的列表(如果输入参数也为多个)。
注释:
numpy.atleast_1d返回的是arys1, arys2…的视图(view),而非副本(copy)。
# 标量输入会被转换为一维数组
>>> arr1 = np.atleast_1d(1)
>>> arr1
array([1])
>>> arr1.shape
(1,)
# 高维输入(维度大于1)保持不变
>>> arr2 = np.arange(8).reshape(2,2,2)
>>> arr2
array([[[0, 1],
[2, 3]],
[[4, 5],
[6, 7]]])
>>> arr2.shape
(2, 2, 2)
>>> arr3 = np.atleast_1d(arr2)
>>> arr3
array([[[0, 1],
[2, 3]],
[[4, 5],
[6, 7]]])
>>> arr3.shape
(2, 2, 2)
## numpy.atleast_1d返回的一般是数组的视图
>>> arr3 is arr2
True
# 多个输入参数
>>> arr4 = np.atleast_1d(1, [2,3,4])
>>> arr4
[array([1]), array([2, 3, 4])]
atleast_2d、atleast_3d和atleast_1d类似,只是分别将输入转换为维度至少为2和3的数组,在此不再赘述。
2. broadcast
3. broadcast_to
4. broadcast_arrays
5. expand_dims
numpy.expand_dims(a, axis):拓展数组形状。在指定的axis参数位置插入一个新的轴
- a:类数组。输入数据
- axis:整数、或整数列表/元组,可选参数(从Numpy 1.18.0版本开始,支持整数列表/元组作为输入参数)
- axis的取值范围为[-a.ndim-1, a.ndim],除此之外的值会报错
注释:
numpy.expand_dims(a, axis)返回的是a的视图。
>>> arr1 = np.array([1,2])
>>> arr1
array([1, 2])
>>> arr1.shape
(2,)
>>> arr2 = np.expand_dims(arr1,axis=0)
>>> arr2
array([[1, 2]])
>>> arr2.shape
(1, 2)
>>> arr3 = np.expand_dims(arr1,axis=1)
>>> arr3
array([[1],
[2]])
>>> arr3.shape
(2, 1)
>>> np.expand_dims(arr1,axis=2)
numpy.AxisError: axis 2 is out of bounds for array of dimension 2
注释:
numpy.expand_dims(a, axis=0)等同于a[np.newaxis, :]或a[np.newaxis];numpy.expand_dims(a, axis=0)等同于a[:, np.newaxis](np.newaxis可以用None代替)。
>>> arr1 = np.array([1,2])
>>> arr1
array([1, 2])
>>> arr1.shape
(2,)
>>> arr2 = arr1[np.newaxis,:]
>>> arr2
array([[1, 2]])
>>> arr2.shape
(1, 2)
>>> arr3 = arr1[:,np.newaxis]
>>> arr3
array([[1],
[2]])
>>> arr3.shape
(2, 1)
6. squeeze
numpy.squeeze(a, axis=None):从a中移除长度为1的轴
- a:类数组。输入数据
- axis:None、或整数、或整数列表/元组,可选参数
- None:移除所有长度为1的轴
- 整数或整数列表/元组:移除指定的单个或多个轴。如果数组在指定的轴上的长度大于1,则会报错
注释:
- numpy.squeeze返回的是a自身或其视图
- 如果a在所有轴上的长度都为1,那么numpy.squeeze返回的是0维的Numpy数组,而非标量
>>> arr1 = np.array([[[0], [1], [2]]])
>>> arr1.shape
(1, 3, 1)
>>> np.squeeze(arr1).shape
(3,)
>>> np.squeeze(arr1,axis=0).shape
(3, 1)
>>> np.squeeze(arr1,axis=1).shape
ValueError: cannot select an axis to squeeze out which has size not equal to one
>>> arr2 = np.array([[1]])
>>> arr2.shape
(1, 1)
>>> np.squeeze(arr2)
array(1)
>>> np.squeeze(arr2).shape
() # 0维Numpy数组