创建数组
import numpy as np
# 基础款:从列表转数组
data = [1, 2, 3, 4, 5]
arr = np.array(data)
# 懒人专用:自动生成序列
seq1 = np.arange(10) # 0到9
seq2 = np.arange(0, 10, 2) # 0,2,4,6,8
# 做图用的等分点
points = np.linspace(0, 1, 5) # [0, 0.25, 0.5, 0.75, 1]
# 初始化用
zeros = np.zeros((3, 3)) # 3x3零矩阵
ones = np.ones((2, 4)) # 2x4一矩阵
random = np.random.rand(3, 3) # 随机矩阵
批量操作
# 整个数组一起算
arr = np.array([1, 2, 3, 4, 5])
result1 = arr * 2 # 每个数乘2
result2 = arr + 10 # 每个数加10
result3 = arr ** 2 # 每个数平方
# 两个数组对应位置计算
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
sum_ab = a + b # [5, 7, 9]
mul_ab = a * b # [4, 10, 18]
# 比大小(返回布尔数组)
mask = arr > 3 # [False, False, False, True, True]
filtered = arr[arr > 3] # [4, 5]
形状操作
arr = np.arange(12) # [0到11]
# 改变形状
reshaped = arr.reshape(3, 4) # 变成3行4列
flattened = reshaped.flatten() # 重新变回一维
# 转置矩阵
matrix = np.array([[1, 2, 3], [4, 5, 6]])
transposed = matrix.T # 行变列,列变行
# 拼接数组
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
combined = np.concatenate([a, b]) # [1,2,3,4,5,6]
统计操作
data = np.array([1, 2, 3, 4, 5, 6])
# 常用统计量
print(data.sum()) # 总和
print(data.mean()) # 平均值
print(data.std()) # 标准差
print(data.min()) # 最小值
print(data.max()) # 最大值
# 按维度计算
matrix = np.array([[1, 2, 3],
[4, 5, 6]])
print(matrix.sum(axis=0)) # 每列的和 [5, 7, 9]
print(matrix.sum(axis=1)) # 每行的和 [6, 15]
索引技巧
arr = np.array([10, 20, 30, 40, 50])
# 基础索引
print(arr[0]) # 第一个元素
print(arr[-1]) # 最后一个元素
# 切片(和列表一样)
print(arr[1:4]) # [20, 30, 40]
print(arr[::2]) # 隔一个取一个 [10, 30, 50]
# 花式索引
indices = [0, 2, 4]
print(arr[indices]) # [10, 30, 50]
# 布尔索引
mask = arr > 25
print(arr[mask]) # [30, 40, 50]
我的实用小技巧
# 1. 生成测试数据
test_data = np.random.normal(0, 1, 100) # 100个正态分布数
# 2. 处理缺失值
data = np.array([1, 2, np.nan, 4, 5])
clean_data = data[~np.isnan(data)] # 去掉nan
# 3. 保存和加载
np.save('data.npy', arr) # 保存为二进制文件
loaded = np.load('data.npy') # 加载文件
# 4. 重复数据
repeat_arr = np.repeat([1, 2], 3) # [1,1,1,2,2,2]
# 5. 网格坐标(画3D图常用)
x = np.linspace(-5, 5, 50)
y = np.linspace(-5, 5, 50)
X, Y = np.meshgrid(x, y) # 生成网格坐标
为什么用NumPy?
import time
size = 1000000
# 纯Python列表
python_list = list(range(size))
start = time.time()
result = [x * 2 for x in python_list]
print(f"Python列表耗时: {time.time() - start:.4f}秒")
# NumPy数组
np_array = np.arange(size)
start = time.time()
result = np_array * 2
print(f"NumPy数组耗时: {time.time() - start:.4f}秒")
NumPy的核心就三点:
- 整个数组一起算,别用for循环
- 记住轴的概念,axis=0是列,axis=1是行
- 多用向量化操作,少写显式循环
刚开始可能不习惯,用多了就回不去了。处理数字数据时,NumPy比纯Python快几十倍是常事。别在数据量大时还傻傻地用for循环,NumPy内置的函数基本都是优化过的C代码。
实际项目中,数据清洗、预处理、简单计算,NumPy都能搞定。更复杂的交给Pandas,但NumPy是基础。
就这些,够用了。