NumPy数据处理相关技巧

创建数组

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的核心就三点:

  1. 整个数组一起算,别用for循环
  2. 记住轴的概念,axis=0是列,axis=1是行
  3. 多用向量化操作,少写显式循环

刚开始可能不习惯,用多了就回不去了。处理数字数据时,NumPy比纯Python快几十倍是常事。别在数据量大时还傻傻地用for循环,NumPy内置的函数基本都是优化过的C代码。

实际项目中,数据清洗、预处理、简单计算,NumPy都能搞定。更复杂的交给Pandas,但NumPy是基础。

就这些,够用了。