创建NumPy数组:
-
从Python列表创建数组:
使用
np.array()
函数可以从Python列表创建NumPy数组。例如:arr = np.array([1, 2, 3, 4, 5])
-
使用特殊数组:
NumPy提供了一些快速创建特殊数组的函数,如全零、全一、单位矩阵等。例如:
zeros = np.zeros((2, 3)) # 创建一个2x3的全零数组 ones = np.ones((3, 3)) # 创建一个3x3的全一数组 identity = np.eye(3) # 创建一个3x3的单位矩阵
-
生成等间隔数列:
np.linspace()
函数用于生成在指定范围内等间隔的数列。例如:linspace_arr = np.linspace(0, 1, 5) # 生成0到1之间的5个等间隔数
-
随机生成数组:
np.random
模块提供了用于生成随机数组的函数。例如,np.random.rand()
生成0到1之间的随机数。random_arr = np.random.rand(2, 2) # 生成2x2的随机数数组
数组属性和操作:
-
获取数组形状、维度和元素数量:
shape
属性返回数组的形状,如(n, m)
表示n行m列。ndim
属性返回数组的维度。size
属性返回数组的元素数量。
例如:
shape = arr.shape dimensions = arr.ndim size = arr.size
-
重塑数组形状:
使用
reshape()
函数可以改变数组的形状。例如:reshaped = arr.reshape(2, 3) # 将数组变形为2x3的形状
-
访问数组元素:
通过索引可以访问数组的特定元素。NumPy的索引从0开始。例如:
element = arr[2] # 获取索引为2的元素
数组运算:
-
数组与标量的运算:
NumPy允许对整个数组进行标量运算,即将标量应用到数组的每个元素。例如:
result = arr + 2 # 数组中的每个元素加2
-
数组之间的运算:
对两个数组执行相同形状的元素级操作。例如:
result = arr1 + arr2 # 对应元素相加
-
数组内积和矩阵乘法:
np.dot()
函数用于计算两个数组的内积。np.matmul()
函数用于执行矩阵乘法。
例如:
dot_product = np.dot(arr1, arr2) # 内积 matrix_product = np.matmul(matrix1, matrix2) # 矩阵乘法
-
常见的数学函数:
NumPy提供了各种数学函数,如平均值、标准差、最大值和最小值的计算。例如:
mean = np.mean(arr) std_dev = np.std(arr) max_val = np.max(arr) min_val = np.min(arr)
数组索引和切片:
-
切片数组:
使用切片操作可以选择数组中的一部分。切片操作的语法为
start:stop:step
。sliced_arr = arr[start:stop:step]
-
多维数组索引和切片:
对于多维数组,可以使用逗号分隔的索引和切片来访问特定维度的元素。例如:
element = arr[2, 3] # 获取二维数组中的特定元素 sub_array = arr[:2, 1:3] # 切片获取子数组
-
条件和布尔索引:
可以使用条件表达式创建布尔数组,然后使用这些布尔数组来索引原始数组中满足条件的元素。例如:
bool_arr = arr > 2 # 创建布尔数组,表示大于2的元素 filtered_arr = arr[bool_arr] # 使用布尔数组进行索引,获取满足条件的元素
数组的复制和视图:
-
复制数组:
使用
copy()
方法可以创建原始数组的副本,修改副本不会影响原始数组。例如:copy_arr = arr.copy()
-
创建数组的视图:
使用
view()
方法可以创建一个原始数组的视图,即共享相同的数据存储。修改视图也会影响原始数组。例如:view_arr = arr.view()
数组排序:
使用 np.sort()
函数可以对数组进行排序。默认情况下,它会返回一个新的已排序副本,不会修改原始数组。例如:
sorted_arr = np.sort(arr)
数组的文件操作:
NumPy允许将数组保存到磁盘并从磁
盘加载。可以使用 np.save()
和 np.load()
函数执行这些操作。例如:
np.save('filename.npy', arr) # 保存数组到文件
loaded_arr = np.load('filename.npy') # 从文件加载数组
广播(Broadcasting):
广播是NumPy的一个重要功能,它允许在不同形状的数组之间进行运算。NumPy会自动调整数组的形状以匹配运算的要求,使得元素级操作能够顺利进行。
广播的规则如下:
-
维度较小的数组会在维度上进行"补齐",以与维度较大的数组匹配。 在某个维度上,如果两个数组的尺寸相同或其中一个数组的尺寸为1,那么它们在这个维度上是兼容的。
-
如果两个数组在所有维度上都兼容,它们可以一起广播。 这意味着,NumPy会自动扩展较小的数组以匹配较大数组的形状。
-
如果两个数组在任何一个维度上都不兼容,则广播操作无法进行,将抛出错误。
以下是广播的示例:
import numpy as np
# 示例 1:标量与数组的广播
arr = np.array([1, 2, 3])
result = arr + 5 # 将5广播到arr的每个元素上
# 结果:array([6, 7, 8])
# 示例 2:数组与数组的广播
arr1 = np.array([[1, 2], [3, 4]])
arr2 = np.array([10, 20])
result = arr1 + arr2 # arr2在第二维度上被广播
# 结果:array([[11, 22],
# [13, 24]])
# 示例 3:无法广播的情况
arr1 = np.array([[1, 2], [3, 4]])
arr3 = np.array([1, 2, 3])
result = arr1 + arr3 # 无法广播,因为维度不兼容
# 报错:ValueError: operands could not be broadcast together with shapes (2,2) (3,)
# 示例 4:广播的应用 - 归一化
data = np.array([[10, 20, 30], [40, 50, 60], [70, 80, 90]])
mean = data.mean(0) # 沿着第0维度(列)计算均值
std_dev = data.std(0) # 沿着第0维度(列)计算标准差
normalized_data = (data - mean) / std_dev # 广播均值和标准差
上述示例中,广播使我们能够轻松地对不同形状的数组执行元素级操作。在示例3中,由于维度不兼容,所以无法进行广播操作,会引发错误。
广播功能在实际工作中非常有用,可以用于执行许多常见的数据处理任务,如数据归一化、矢量化运算等。使用广播,可以编写更简洁、高效和可读性强的NumPy代码。