NumPy 基础
高效的数值计算库 —— Pandas 的基础
什么是 NumPy?
NumPy(Numerical Python) 是 Python 科学计算的基础库。
为什么学 NumPy?
- Pandas 基于 NumPy
- 比 Python 列表快 10-100 倍
- 矩阵运算(线性代数)
类比:
- Stata: 内置 matrix 功能
- R: 向量运算
- Python: NumPy 数组
安装与导入
bash
pip install numpypython
import numpy as np # 标准别名创建数组
1. 从列表创建
python
import numpy as np
# 一维数组
ages = np.array([25, 30, 35, 40])
print(ages) # [25 30 35 40]
print(type(ages)) # <class 'numpy.ndarray'>
# 二维数组(矩阵)
data = np.array([
[1, 2, 3],
[4, 5, 6]
])
print(data)
# [[1 2 3]
# [4 5 6]]2. 特殊数组
python
# 全零
zeros = np.zeros(5) # [0. 0. 0. 0. 0.]
# 全一
ones = np.ones((2, 3)) # 2行3列的全1矩阵
# 序列
seq = np.arange(0, 10, 2) # [0 2 4 6 8]
# 等差数列
lin = np.linspace(0, 1, 5) # [0. 0.25 0.5 0.75 1. ]
# 随机数
rand = np.random.rand(5) # 5个0-1之间的随机数
randn = np.random.randn(5) # 5个标准正态分布随机数数组属性
python
data = np.array([[1, 2, 3], [4, 5, 6]])
print(data.shape) # (2, 3) - 形状
print(data.ndim) # 2 - 维度
print(data.size) # 6 - 元素总数
print(data.dtype) # int64 - 数据类型数组运算
向量化运算(比循环快)
python
incomes = np.array([50000, 60000, 75000, 80000])
# 向量化(快)
after_tax = incomes * 0.75
log_incomes = np.log(incomes)
# 循环(慢)
after_tax = []
for income in incomes:
after_tax.append(income * 0.75)基本运算
python
a = np.array([1, 2, 3, 4])
b = np.array([10, 20, 30, 40])
print(a + b) # [11 22 33 44]
print(a * b) # [10 40 90 160]
print(a ** 2) # [1 4 9 16]
print(a > 2) # [False False True True]统计函数
python
scores = np.array([85, 92, 78, 90, 88])
print(scores.mean()) # 86.6 - 均值
print(scores.std()) # 5.08 - 标准差
print(scores.min()) # 78 - 最小值
print(scores.max()) # 92 - 最大值
print(scores.sum()) # 433 - 总和实战案例
案例 1:标准化数据
python
# 原始收入数据
incomes = np.array([50000, 60000, 75000, 80000, 95000])
# Z-score 标准化
mean = incomes.mean()
std = incomes.std()
incomes_std = (incomes - mean) / std
print(f"标准化后: {incomes_std}")
# 标准化后: [-1.38 -0.74 0.21 0.53 1.38]案例 2:批量计算
python
# 100个受访者的收入
np.random.seed(42)
incomes = np.random.normal(70000, 15000, 100) # 均值7万,标准差1.5万
# 计算税后收入(25%税率)
after_tax = incomes * 0.75
# 统计
print(f"平均税后收入: ${after_tax.mean():,.0f}")
print(f"中位数: ${np.median(after_tax):,.0f}")
print(f"标准差: ${after_tax.std():,.0f}")案例 3:条件筛选
python
ages = np.array([22, 35, 45, 28, 55, 30, 48])
# 筛选30-50岁
mask = (ages >= 30) & (ages <= 50)
middle_aged = ages[mask]
print(middle_aged) # [35 45 30 48]
# 统计
print(f"30-50岁: {len(middle_aged)} 人")
print(f"占比: {len(middle_aged)/len(ages)*100:.1f}%")NumPy vs Python 列表
python
import time
# 创建大数组
size = 1000000
py_list = list(range(size))
np_array = np.arange(size)
# Python 列表(慢)
start = time.time()
result = [x * 2 for x in py_list]
print(f"列表: {time.time() - start:.4f}秒")
# NumPy 数组(快)
start = time.time()
result = np_array * 2
print(f"NumPy: {time.time() - start:.4f}秒")
# NumPy 通常快 10-100 倍!常用函数
数学函数
python
x = np.array([1, 4, 9, 16, 25])
np.sqrt(x) # 平方根
np.log(x) # 自然对数
np.log10(x) # 以10为底
np.exp(x) # e^x
np.abs(x) # 绝对值聚合函数
python
data = np.array([85, 92, 78, 90, 88, 76, 95])
np.mean(data) # 均值
np.median(data) # 中位数
np.std(data) # 标准差
np.var(data) # 方差
np.min(data) # 最小值
np.max(data) # 最大值
np.percentile(data, 25) # 25分位数NumPy 在数据分析中的应用
应用 1:相关系数
python
# 年龄和收入
ages = np.array([25, 30, 35, 40, 45, 50])
incomes = np.array([50000, 60000, 75000, 80000, 90000, 95000])
# 计算相关系数
correlation = np.corrcoef(ages, incomes)[0, 1]
print(f"相关系数: {correlation:.3f}") # 0.995(强正相关)应用 2:分组统计
python
# 按性别分组的收入
male_incomes = np.array([60000, 75000, 80000, 90000])
female_incomes = np.array([55000, 70000, 72000, 85000])
print(f"男性平均: ${male_incomes.mean():,.0f}")
print(f"女性平均: ${female_incomes.mean():,.0f}")
print(f"性别差距: ${male_incomes.mean() - female_incomes.mean():,.0f}")练习题
python
# 练习 1:创建和操作数组
# 创建1-100的数组,筛选出偶数,计算平方和
# 练习 2:统计分析
ages = np.array([22, 25, 28, 30, 35, 40, 45, 50, 55, 60])
# 计算:均值、中位数、标准差、25%和75%分位数
# 练习 3:数据标准化
scores = np.array([65, 72, 85, 90, 78, 88, 92, 70, 95, 82])
# 进行 Min-Max 标准化到 0-1 范围下一步
NumPy 是基础,下一节我们将学习 Pandas(基于 NumPy 的数据分析库),这才是社科数据分析的核心工具!
继续!