Numpy: 在任意轴上重构多维数组
在本文中,我们将介绍Numpy中的重构(reshaping)操作,特别是在任意轴上重构多维数组的方法。这是Numpy中一个相当有用的功能,可帮助我们处理各种数据科学工作流中常见的需要变换维度、形状的任务。我们将首先介绍Numpy中的ndarray数据类型及其属性以及一些基本操作,然后将重点关注如何在任意轴上重构多维数组。
阅读更多:Numpy 教程
Numpy 中的 ndarray 类型
在Numpy中,ndarray(n-dimensional array,多维数组)是Numpy中最重要、最常用的数据类型。它可以是一维、二维、三维或者更高维度的数组,支持各种数学运算、科学计算中的常见操作(例如排序、索引、切片等),同时由于其内部实现方式的优化,ndarray比Python内置的list类型更加高效。
我们可以使用numpy.array()方法创建numpy数组,例如:
import numpy as np
arr1 = np.array([1, 2, 3, 4, 5])
print(arr1)
# Output: [1 2 3 4 5]
arr2 = np.array([[1, 2, 3], [4, 5, 6]])
print(arr2)
# Output:
# [[1 2 3]
# [4 5 6]]
除了使用numpy.array()方法,我们还可以使用一些Numpy提供的用于生成特定类型、形状数组的方法,例如:
# 创建一个长度为10的一维数组,每个元素都是0
arr_zeros = np.zeros(10)
print(arr_zeros)
# Output: [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
# 创建一个2x2的矩阵,每个元素都是1
arr_ones = np.ones((2, 2))
print(arr_ones)
# Output:
# [[1. 1.]
# [1. 1.]]
# 创建一个3x3的单位矩阵
arr_eye = np.eye(3)
print(arr_eye)
# Output:
# [[1. 0. 0.]
# [0. 1. 0.]
# [0. 0. 1.]]
# 创建一个长度为5的一维数组,每个元素都在0到1之间随机分布
arr_rand = np.random.rand(5)
print(arr_rand)
# Output: [0.79075951 0.40204312 0.32250006 0.14674303 0.24785656]
ndarray的一些重要属性包括:
ndarray.shape:数组的形状,返回一个元组表示数组大小。例如(2, 3)表示为2行3列的数组。ndarray.dtype:ndarray中元素的数据类型。例如int32、float64、complex等。ndarray.ndim:数组的维数(即轴数)。
我们可以使用这些属性来获取数组的信息,例如:
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr.shape) # Output: (2, 3)
print(arr.dtype) # Output: int32
print(arr.ndim) # Output: 2
基础操作
在使用Numpy时,我们通常需要涉及一些基本操作,这些操作包括数组的索引、切片、排序等等。下面我们将介绍一些常用的基础操作。
索引和切片
我们可以使用类似Python中的切片的方式来获取数组中的一个子集。例如:
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 获取第1行,第2列的元素(注意Numpy的索引从0开始)
print(arr[0, 1]) # Output: 2
# 获取第2行和第3行的元素
print(arr[1:3, :])
# Output:
# [[4 5 6]
# [7 8 9]]
# 获取第3列和第4列的元素
print(arr[:, 2:4])
# Output:
# [[3]
# [6]
# [9]]
排序
我们可以使用numpy.sort()方法对数组进行排序。默认情况下,numpy.sort()方法会返回排序后的数组,但并不改变原数组。例如:
import numpy as np
arr = np.array([2, 1, 4, 3, 5])
sorted_arr = np.sort(arr)
print(sorted_arr) # Output: [1 2 3 4 5]
print(arr) # Output: [2 1 4 3 5]
另外,Numpy还提供了另一个方法ndarray.sort()来直接修改原数组:
import numpy as np
arr = np.array([2, 1, 4, 3, 5])
arr.sort()
print(arr) # Output: [1 2 3 4 5]
在任意轴上重构多维数组
在数据科学中,我们经常需要将一个数组在不同轴上进行变换,本节将介绍如何使用Numpy实现任意轴上的重构(reshaping)操作。
一维数组的重构
对于一维数组,我们可以使用numpy.reshape()方法进行重构。例如,将长度为6的一维数组重构为2×3的二维数组:
import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6])
reshaped = np.reshape(arr, (2, 3))
print(reshaped)
# Output:
# [[1 2 3]
# [4 5 6]]
多维数组的重构
对于多维数组,我们可以指定不同的轴来进行重构。例如,将一个3x3x2的三维数组在第0个轴上进行重构(将第0个轴中的元素作为第2个轴,第2个轴中的元素作为第0个轴),得到一个2x3x3的三维数组:
import numpy as np
arr = np.array([[[1, 2], [3, 4], [5, 6]],
[[7, 8], [9, 10], [11, 12]],
[[13, 14], [15, 16], [17, 18]]])
reshaped = np.moveaxis(arr, 0, 2)
print(reshaped.shape)
# Output: (2, 3, 3)
print(reshaped)
# Output:
# [[[ 1 7 13]
# [ 3 9 15]
# [ 5 11 17]]
# [[ 2 8 14]
# [ 4 10 16]
# [ 6 12 18]]]
在上述代码中,我们使用了Numpy提供的np.moveaxis()方法将数组在第0个轴和第2个轴之间进行移动。这相当于将第0个轴中的元素作为第2个轴,将第2个轴中的元素作为第0个轴,从而实现了在任意轴上的重构。
总结
在本文中,我们介绍了Numpy中的重构(reshaping)操作,特别是在任意轴上重构多维数组的方法。我们首先介绍了Numpy中的ndarray数据类型及其属性以及一些基本操作,然后重点讲解了如何在任意轴上重构多维数组。这是Numpy中一个相当有用的功能,可帮助我们处理各种数据科学工作流中常见的需要变换维度、形状的任务。希望本文能够帮助读者更好地理解和应用Numpy中的重构操作。
极客教程