Skip to content

NumPy 基础

高效的数值计算库 —— Pandas 的基础


什么是 NumPy?

NumPy(Numerical Python) 是 Python 科学计算的基础库。

为什么学 NumPy?

  • Pandas 基于 NumPy
  • 比 Python 列表快 10-100 倍
  • 矩阵运算(线性代数)

类比

  • Stata: 内置 matrix 功能
  • R: 向量运算
  • Python: NumPy 数组

安装与导入

bash
pip install numpy
python
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 的数据分析库),这才是社科数据分析的核心工具!

继续!

基于 MIT 许可证发布。内容版权归作者所有。