page contents

用Python和NumPy进行科学计算,掌握这几个核心数组操作,数据分析速度快到飞起

还记得那次处理一个包含百万级数据的CSV文件。用纯Python循环遍历 整整跑了两个小时 我都快崩溃了。后来同事看不下去了 直接给我展示了NumPy的威力。同样的操作 几秒钟就搞定。那一刻真的被震撼到了。

attachments-2025-09-YpIazVvh68d49ce834573.png还记得那次处理一个包含百万级数据的CSV文件。用纯Python循环遍历  整整跑了两个小时  我都快崩溃了。后来同事看不下去了  直接给我展示了NumPy的威力。同样的操作  几秒钟就搞定。那一刻真的被震撼到了。

01NumPy就像是给Python装了个涡轮增压器。它的核心是N维数组对象ndarray  这玩意儿比Python原生列表快几十倍呢。

为什么这么快?

因为NumPy底层用C语言实现  数据在内存中连续存储  而且支持向量化操作。简单说就是一次性处理整个数组  而不是像Python那样一个一个元素循环。

import numpy as np

import time

# 创建一个大数组

data = list(range(1000000))

np_data = np.array(data)

# Python原生方式计算平方

start = time.time()

python_result = [x**2 for x in data]

python_time = time.time() - start

# NumPy方式计算平方

start = time.time()

numpy_result = np_data ** 2

numpy_time = time.time() - start

print(f"Python耗时: {python_time:.4f}秒")

print(f"NumPy耗时: {numpy_time:.4f}秒")

print(f"NumPy快了: {python_time/numpy_time:.1f}倍")

这个对比结果会让你大吃一惊的。

02数组创建和基础操作是入门必须掌握的。我在项目中最常用这几种创建方式。

# 从列表创建

arr1 = np.array([1, 2, 3, 4, 5])

# 创建等差数列 在数据可视化中特别有用

x = np.linspace(0, 10, 100)  # 0到10之间100个点

# 创建随机数组 做模拟实验必备

random_data = np.random.normal(0, 1, (1000, 5))  # 1000行5列的正态分布数据

# 创建特殊数组

zeros = np.zeros((3, 4))      # 全零数组

ones = np.ones((2, 3))        # 全一数组

identity = np.eye(4)          # 单位矩阵

有个小技巧。

创建大数组时  用np.empty()比np.zeros()快一些  因为它不初始化值。当然前提是你马上就要覆盖这些值。

03数组索引和切片操作太重要了。我之前总是搞混  后来发现规律就简单多了。

# 创建一个2D数组做演示

matrix = np.array([[1, 2, 3, 4],

                   [5, 6, 7, 8],

                   [9, 10, 11, 12]])


# 基础索引 - 获取单个元素

print(matrix[1, 2])  # 第2行第3列的元素 结果是7

# 切片操作 - 获取子数组

print(matrix[:2, 1:3])  # 前两行 第2-3列

# 结果是:

# [[2 3]

#  [6 7]]

# 布尔索引 - 这个超级实用

mask = matrix > 6

filtered_data = matrix[mask]

print(filtered_data)  # [7 8 9 10 11 12]

# 花式索引 - 用数组作为索引

rows = [0, 2]

cols = [1, 3]

selected = matrix[rows, cols]  # 选择(0,1)和(2,3)位置的元素

print(selected)  # [2 12]

布尔索引真的是神器啊。

处理数据筛选特别方便  比如找出所有大于某个阈值的数据。

04向量化操作是NumPy的精髓。一旦掌握了  你就再也回不去原来的循环写法了。

# 数学运算 - 全部都是元素级别的

a = np.array([1, 2, 3, 4])

b = np.array([5, 6, 7, 8])

# 基础运算

result1 = a + b      # [6 8 10 12]

result2 = a * b      # [5 12 21 32]

result3 = a ** 2     # [1 4 9 16]

# 聚合函数 - 处理统计分析必备

data = np.random.normal(100, 15, 1000)  # 生成1000个正态分布数据

mean_val = np.mean(data)        # 平均值

std_val = np.std(data)          # 标准差

median_val = np.median(data)    # 中位数

percentile_95 = np.percentile(data, 95)  # 95百分位数

# 沿轴操作 - 处理多维数据的关键

matrix_2d = np.random.rand(100, 5)  # 100行5列的随机矩阵

column_means = np.mean(matrix_2d, axis=0)  # 每列的平均值

row_sums = np.sum(matrix_2d, axis=1)       # 每行的和

print(f"每列平均值: {column_means}")

print(f"行和的形状: {row_sums.shape}")

05形状操作和广播机制是NumPy的高级特性。掌握这些  你就能处理更复杂的数据结构了。

# 形状变换

original = np.arange(12)  # [0 1 2 3 4 5 6 7 8 9 10 11]

# reshape - 改变形状但不改变数据

reshaped = original.reshape(3, 4)

print("3x4矩阵:")

print(reshaped)

# 转置

transposed = reshaped.T

print("转置后:")

print(transposed)

# 广播机制 - 这个概念很重要

matrix = np.array([[1, 2, 3],

                   [4, 5, 6],

                   [7, 8, 9]])


# 给每行加上不同的值

row_additions = np.array([10, 20, 30])

result = matrix + row_additions.reshape(-1, 1)

print("广播结果:")

print(result)

# 数组拼接

arr1 = np.array([[1, 2], [3, 4]])

arr2 = np.array([[5, 6], [7, 8]])

# 垂直拼接

vertical = np.vstack([arr1, arr2])

# 水平拼接  

horizontal = np.hstack([arr1, arr2])

print("垂直拼接:")

print(vertical)

print("水平拼接:")

print(horizontal)

掌握了这些核心操作  你的数据处理效率会有质的飞跃。

我现在处理几GB的数据文件都不怎么担心了  NumPy配合pandas简直无敌。当然还要注意内存使用  大数据集的时候记得分批处理哦。

最后建议大家多在实际项目中练习  光看代码是不够的。遇到性能瓶颈的时候  第一个想到的就应该是NumPy向量化操作。

更多相关技术内容咨询欢迎前往并持续关注好学星城论坛了解详情。

想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2022-05-rLS4AIF8628ee5f3b7e12.jpg

  • 发表于 2025-09-25 09:37
  • 阅读 ( 46 )
  • 分类:Python开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

1479 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 2228 文章
  3. Pack 1479 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章