Skip to main content

NumPy 入门与数组创建

NumPy 是 Python 科学计算和数据分析的基础包,也是后续 Pandas 的底层依赖。


为什么量化投资需要 NumPy?

问题:批量数值运算

已知若干家跨国公司的市值(美元),把它们全部换算为人民币:

import numpy as np

# 模拟 50 家公司的美元市值
import random
a = [random.uniform(100, 200) for _ in range(50)]

# ❌ 原生 Python:需要循环或列表推导
rate = 6.8
b = [x * rate for x in a]

# ✅ NumPy:直接向量化运算
a_arr = np.array(a)
b_arr = a_arr * 6.8 # 一行搞定!

购物车总价:已知每种商品的价格和数量,求总金额:

prices = np.array([random.uniform(10, 20) for _ in range(50)])
quantities = np.array([random.randint(5, 10) for _ in range(50)])
total = np.sum(prices * quantities) # 逐项相乘再求和

NumPy 的核心价值:批量数据运算时不用写循环,代码简洁且比原生 Python 快 10-100 倍。

其他可选工具对比:

工具特点局限
Excel手工操作无编程能力
SAS/SPSS统计功能丰富无编程,灵活性差
R 语言数据分析专用应用面窄,只限数据分析

Python 学一门语言,各方面都能用——NumPy / Pandas / Matplotlib 构成数据科学三大支柱。


ndarray —— NumPy 的核心数据结构

ndarray(N-dimensional array)是多维数组对象。

import numpy as np # 官方推荐的导入方式
a = np.array([1, 2, 3, 4, 5])

ndarray vs Python 列表

特性Python 列表ndarray
元素类型可混用不同类型必须相同类型
大小可动态增删创建后大小固定

这两个限制来自底层 C 语言内存结构,也正是 NumPy 高效的原因。

常用属性

a = np.array([[1, 2, 3], [4, 5, 6]]) # 2行3列

print(a.dtype) # int64 —— 元素类型
print(a.size) # 6 —— 总元素个数
print(a.shape) # (2, 3) —— 几行几列
print(a.ndim) # 2 —— 维度数

dtype 数据类型:

类型说明
int8, int16, int32, int64有符号整数
uint8 ... uint64无符号整数(只能 ≥0)
float16, float32, float64浮点数
bool_布尔型

默认 float64——因为大部分运算涉及除法,小数更安全。可用 dtype 参数指定类型。

转置 T

a = np.array([[1, 2, 3], [4, 5, 6]])
print(a.T)
# [[1 4]
# [2 5]
# [3 6]]

理解多维数组

  • 一维:一条线,shape=(n,)
  • 二维:一张纸(行列),shape=(行, 列)
  • 三维:一叠纸(页×行×列),shape=(页, 行, 列)
a3d = np.array([[[1,2,3],[4,5,6]], [[7,8,9],[10,11,12]]])
print(a3d.shape) # (2, 2, 3) → 2页,每页2行3列

创建数组的多种方法

从列表创建

np.array([1, 2, 3, 4]) # 一维
np.array([[1, 2], [3, 4]]) # 二维

全零 / 全一 / 空数组

np.zeros(10) # 10 个 0.(默认 float64)
np.zeros(10, dtype=int) # 10 个 0 (指定整数)
np.ones(5) # 5 个 1.
np.empty(100) # 只申请内存,不初始化

np.empty 少一步清零操作,速度快。适用于之后会完全覆盖所有值的情况。里面的值是内存残留的随机数

等差数列 —— arange

np.arange(0, 10, 2) # [0 2 4 6 8] —— 起始、结束、步长
np.arange(0, 1, 0.1) # 步长可为小数!(原生 range 做不到)

等间距分割 —— linspace

np.linspace(0, 10, 101) # 起始、结束、份数
# 0 到 10 分成 101 份(含两端),相邻间隔相等
arangelinspace
第三参数步长元素个数
包含终点
典型用途按步长生成画函数图像(等距采样)

linspace 绘制函数图像:

import matplotlib.pyplot as plt

x = np.linspace(-10, 10, 10000)
y = x ** 2
plt.plot(x, y) # 点足够密→看起来是平滑曲线
plt.show()

其他方法

np.eye(3) # 单位矩阵(对角为1,其余为0)

# reshape 变形
a = np.arange(15) # 一维 0-14
b = a.reshape(3, 5) # 变成 3行5列