1. Numpy ndarray 多维数组对象介绍
NumPy是Python科学计算的一个核心库,是Python中数值计算的重要工具,它主要提供高效的多维数组对象(ndarray)和相关的操作函数。NumPy的核心是ndarray对象,它是一种强大而灵活的多维数组容器。在NumPy中,使用ndarray对象存储和处理数据,它是由同类型的元素组成的数组,即每个元素都是相同的数据类型,ndarray对象是一个 n-dimensional array,即多维数组对象。
在NumPy中,有助于处理大数据集时进行高效的 数组计算。使用NumPy的ndarray可以避免Python列表中进行计算的许多问题。ndarray提供了向量化操作,以及其他的 数组操作、统计和线性代数等高级功能。
1.1 创建ndarray对象
创建ndarray对象的方法有很多,下面我们将介绍一些常用的创建方法:
使用numpy.array()函数创建: 这是一种创建一维或多维数组的通用方法。使用该方法需要传入一个可迭代的对象,例如列表或元组,或使用Python中range()函数生成的序列。
import numpy as np
# 创建一维数组
arr1 = np.array([1, 2, 3, 4, 5])
print(arr1)
# 创建二维数组
arr2 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr2)
输出结果为:
[1 2 3 4 5]
[[1 2 3]
[4 5 6]
[7 8 9]]
使用numpy.zeros()函数创建: 可以创建指定形状的全都为0的数组。传入元组来声明数组的形状,元组中的每个元素对应于一个维度,指定数组形状时可以通过 axis 参数来指定数组是按行排列还是按列排列。
import numpy as np
# 创建一维数组
arr1 = np.zeros(5)
print(arr1)
# 创建二维数组
arr2 = np.zeros((3, 2))
print(arr2)
输出结果为:
[0. 0. 0. 0. 0.]
[[0. 0.]
[0. 0.]
[0. 0.]]
使用numpy.ones()函数创建: 可以创建指定形状的全都为1的数组。
import numpy as np
# 创建一维数组
arr1 = np.ones(5)
print(arr1)
# 创建二维数组
arr2 = np.ones((3, 2))
print(arr2)
输出结果为:
[1. 1. 1. 1. 1.]
[[1. 1.]
[1. 1.]
[1. 1.]]
2. ndarry对象的属性和方法
除了上述创建方法外,ndarray还具有许多有用的属性和方法,下面我们将逐一介绍。
2.1 属性
ndim属性: 该属性返回数组的维度数,即数组的秩。
import numpy as np
# 创建三维数组
arr = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
# 访问ndarray对象的维度
print("数组维度:", arr.ndim)
输出结果为:
数组维度: 3
shape属性: 该属性返回数组的维度及每个维度的长度。
import numpy as np
# 创建二维数组
arr = np.array([[1, 2], [3, 4], [5, 6]])
# 访问ndarray对象的shape属性
print("数组维度:", arr.shape)
输出结果为:
数组维度: (3, 2)
2.2 方法
reshape()方法: 该方法用于改变数组的形状。reshape() 方法返回具有相同数据的新数组,可以指定一个元组作为参数,其中元组的每个元素表示对应维度的大小,如果其中一个维度是 -1,那么将根据数组的长度和其余维度的大小计算出该维度的大小。
import numpy as np
arr1 = np.array([1, 2, 3, 4, 5, 6])
# reshaping to 2 rows and 3 columns
new_arr1 = np.reshape(arr1, (2, 3))
print("Reshaped array : \n", new_arr1)
arr2 = np.array([[1, 2, 3], [4, 5, 6]])
# reshaping to 3 rows and 2 columns
new_arr2 = np.reshape(arr2, (3, 2))
print("Reshaped array : \n", new_arr2)
输出结果为:
Reshaped array :
[[1 2 3]
[4 5 6]]
Reshaped array :
[[1 2]
[3 4]
[5 6]]
argmax()和argmin()方法: 这两个方法分别返回数组中最大和最小元素的索引。它们可以在搜寻数组中某个区域时非常有用。
import numpy as np
arr = np.array([1, 2, 3, 4, 5, 4, 3, 2, 1])
print("Maximum element index : ", np.argmax(arr))
print("Minimum element index : ", np.argmin(arr))
输出结果为:
Maximum element index : 4
Minimum element index : 0
3. 不同维度的数组之间的运算
虽然可以在同一维度的两个数组之间进行运算,但是在不同维度的数组之间进行运算更具有实用性。
3.1 数组之间的运算
数组必须具有相同的形状才能进行算术运算。在运算期间,将比较两个数组中元素的相对位置,并且在某些情况下可能会重塑其中一个或两个数组的形状以实现匹配。
下面的代码创建了两个数组,一个是形状为(2,3)的一维数组,另一个是形状为(1,6)的二维数组。我们可以对这两个数组进行运算。
import numpy as np
arr1 = np.array([1,2,3,4,5,6]).reshape(2, 3)
arr2 = np.array([7,8,9,10,11,12]).reshape(2, 3)
# 两个数组相加
print("两个数组相加 : \n", arr1 + arr2)
# 两个数组相减
print("两个数组相减 : \n", arr1 - arr2)
# 两个数组相乘
print("两个数组相乘 : \n", arr1 * arr2)
# 两个数组相除
print("两个数组相除 : \n", arr1 / arr2)
输出结果为:
两个数组相加 :
[[ 8 10 12]
[14 16 18]]
两个数组相减 :
[[-6 -6 -6]
[-6 -6 -6]]
两个数组相乘 :
[[ 7 16 27]
[40 55 72]]
两个数组相除 :
[[0.14285714 0.25 0.33333333]
[0.4 0.45454545 0.5 ]]
3.2 数组与标量之间的运算
可以将标量与数组的每个元素进行算术运算。在这种情况下,标量被广播到与数组的形状相同。
import numpy as np
arr = np.array([1, 2, 3, 4, 5])
print("原数组 : \n", arr)
# 对数组的每个元素加上5
print("新数组 : \n", arr + 5)
输出结果为:
原数组 :
[1 2 3 4 5]
新数组 :
[ 6 7 8 9 10]
4. 维度与轴操作
在NumPy中,轴可以看作是一个n维数组的维度。比如,一个二维数组,拥有两个轴,沿着第0轴是行,沿着第1轴是列。在进行数组运算时,通常需要指定运算的轴,以便按照指定的轴进行计算。
4.1 拆分和堆叠数组
在NumPy中,我们可以使用 split()函数将一个数组分成几个子数组,也可以使用 concatenate()函数将几个数组连接成一个数组。
下面的代码演示了如何使用split和join操作。
import numpy as np
arr = np.array([1,2,3,4,5,6,7,8,9,10])
# 将arr按照[2,2,2,2,2]的形状拆分成5个小数组
new_arr = np.split(arr, [2,4,6,8])
print("拆分后的数组 : ", new_arr)
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
# 沿着 axis=0 连接 arr1 和 arr2
new_arr = np.concatenate((arr1, arr2), axis = 0)
print("连接后的数组 : ", new_arr)
输出结果为:
拆分后的数组 : [array([1, 2]), array([3, 4]), array([5, 6]), array([7, 8]), array([ 9, 10])]
连接后的数组 : [1 2 3 4 5 6]
4.2 数组的轴操作
在NumPy中对于数组的维数、轴数和轴的编号有严格的定义,对于不同的数组操作它们的这三个概念有不同的解释。
4.2.1 维数和轴数
在NumPy中,对于n维数组,称n为它的维数。对于数组的第0轴、第1轴、第2轴等,称其轴数为1、2、3等。
4.2.2 轴的编号
在NumPy中,对于n维数组,从前往后的轴编号分别为0、1、2、...n-1,最后一个轴总是被称为第1轴。
我们可以不用指定轴、使用none关键字,Numpy 将自动推断出适合于操作的轴,但推荐明确提供
4.2.3 轴的转置
在NumPy中,可以使用 transpose() 函数对数组进行轴交换。轴交换将在转置之后进行。
import numpy as np
arr = np.array([[1, 2, 3],[4, 5, 6],[7, 8, 9]])
print("原数组:\n", arr)
# 对数组进行转置
new_arr = np.transpose(arr)
print("转置后的数组 : \n", new_arr)
输出结果为:
原数组:
[[1 2 3]
[4 5 6]
[7 8 9]]
转置后的数组 :
[[1 4 7]
[2 5 8]
[3 6 9]]
4.2.4 轴的滚动
在NumPy中,可以使用 rollaxis()函数将数组沿着给定的位置向后滚动指定的轴。给定的位置之前的轴将不会被滚动。
import numpy as np
# 创建三维数组
arr = np.ones([3, 4, 5])
print("原数组 : \n", arr)
# 对数组进行轴的滚动
new_arr = np.rollaxis(arr, 2, 0)
print("滚动后的数组 : \n", new_arr)
输出结果为:
原数组 :
[[[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]]
[[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]]
[[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]]]
滚动后的数组 :
[[[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]]
[[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]]
[[1. 1. 1. 1. 1.]
[1. 1. 1. 1.