NumPy基础:ndarray、创建、索引与运算
NumPy基础:ndarray、创建、索引与运算
NumPy(Numerical Python)是Python科学计算的核心库,提供了高性能的多维数组对象和丰富的数学函数。几乎所有数据科学和机器学习库都建立在NumPy之上。本文将带你掌握NumPy的基础知识。
什么是ndarray
ndarray(N-dimensional array)是NumPy的核心数据结构,是一个快速、灵活的多维数组容器。与Python原生列表相比,ndarray具有以下优势:
- 内存效率:连续存储,占用更少内存
- 计算速度:底层用C实现,向量化运算极快
- 广播机制:支持不同形状数组的算术运算
- 丰富的API:线性代数、傅里叶变换、随机数生成等
import numpy as np
# 创建一维数组
arr = np.array([1, 2, 3, 4, 5])
print(arr) # [1 2 3 4 5]
print(type(arr)) # <class 'numpy.ndarray'>
print(arr.dtype) # int64
print(arr.shape) # (5,)
数组创建方式
NumPy提供了多种创建数组的方式,适用于不同场景:
import numpy as np
# 从Python列表创建
arr1 = np.array([1, 2, 3, 4, 5])
# 创建二维数组
arr2 = np.array([[1, 2, 3], [4, 5, 6]])
print(arr2.shape) # (2, 3)
# 创建全零数组
zeros = np.zeros((3, 4)) # 3x4的零矩阵
zeros_int = np.zeros((2, 3), dtype=int)
# 创建全一数组
ones = np.ones((2, 3))
# 创建单位矩阵
eye = np.eye(4) # 4x4单位矩阵
# 创建等差序列
linear = np.arange(0, 10, 2) # [0, 2, 4, 6, 8]
linspace = np.linspace(0, 1, 5) # 0到1之间均匀取5个点
# 创建随机数组
rand_arr = np.random.rand(3, 3) # 均匀分布 [0, 1)
randn_arr = np.random.randn(3, 3) # 标准正态分布
索引与切片
ndarray支持强大的索引和切片操作,与Python列表类似但更强大:
import numpy as np
arr = np.array([10, 20, 30, 40, 50, 60])
# 基本索引
print(arr[0]) # 10
print(arr[-1]) # 60
# 切片
print(arr[1:4]) # [20 30 40]
print(arr[::2]) # [10 30 50] 步长为2
# 二维数组索引
arr2d = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
print(arr2d[0, 0]) # 1
print(arr2d[1, :]) # [4 5 6] 第二行
print(arr2d[:, 1]) # [2 5 8] 第二列
# 布尔索引
data = np.array([15, 22, 8, 30, 12])
mask = data > 15
print(data[mask]) # [15 22 30]
# 花式索引
indices = [0, 2, 4]
print(data[indices]) # [15 8 12]
向量化运算
NumPy的核心优势在于向量化运算——无需显式循环即可对整个数组进行操作:
import numpy as np
a = np.array([1, 2, 3, 4, 5])
b = np.array([10, 20, 30, 40, 50])
# 逐元素运算
print(a + b) # [11 22 33 44 55]
print(a * b) # [10 40 90 160 250]
print(a ** 2) # [ 1 4 9 16 25]
print(a / 2) # [0.5 1. 1.5 2. 2.5]
# 数学函数
print(np.sqrt(a)) # [1. 1.41421356 1.73205081 2. 2.23606798]
print(np.log(a)) # [0. 0.69314718 1.09861229 1.38629436 1.60943791]
print(np.exp(a)) # [ 2.71828183 7.3890561 20.08553692 54.59815003 148.4131591 ]
# 统计运算
print(np.mean(a)) # 3.0
print(np.sum(a)) # 15
print(np.max(a)) # 5
print(np.std(a)) # 1.4142135623730951
# 矩阵运算
matrix_a = np.array([[1, 2], [3, 4]])
matrix_b = np.array([[5, 6], [7, 8]])
# 矩阵乘法
print(np.dot(matrix_a, matrix_b)) # 或 matrix_a @ matrix_b
# [[19 22]
# [43 50]]
数组变形与合并
import numpy as np
# reshape变形
arr = np.arange(12)
reshaped = arr.reshape(3, 4)
print(reshaped)
# 展平数组
flattened = reshaped.flatten() # 返回副本
raveled = reshaped.ravel() # 返回视图
# 数组合并
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
# 水平拼接
horizontal = np.hstack((a, b)) # [1 2 3 4 5 6]
# 垂直拼接
vertical = np.vstack((a, b)) # [[1 2 3] [4 5 6]]
# concatenate通用合并
merged = np.concatenate((a, b), axis=0)
实战示例:成绩分析
import numpy as np
# 模拟学生成绩
math_scores = np.array([85, 92, 78, 90, 88, 76, 95, 82])
english_scores = np.array([80, 85, 90, 88, 75, 92, 87, 83])
# 计算平均分
avg_math = np.mean(math_scores)
avg_english = np.mean(english_scores)
print(f"数学平均分: {avg_math:.1f}")
print(f"英语平均分: {avg_english:.1f}")
# 计算总分
total = math_scores + english_scores
print(f"总分分布: {total}")
# 找出数学成绩优秀的学生
excellent = math_scores >= 90
print(f"优秀学生人数: {np.sum(excellent)}")
# 成绩标准差
print(f"数学成绩标准差: {np.std(math_scores):.2f}")
总结
NumPy是Python数据科学的基石。掌握ndarray的创建、索引和运算是后续学习Pandas、Matplotlib、Scikit-learn的基础。建议多动手练习,熟悉各种数组操作,逐步建立向量化思维,这将大幅提升你的数据分析效率。