目 录CONTENT

文章目录

掌握NumPy的7大技巧:告别循环,实现代码向量化加速

青云TOP
2025-10-09 / 0 评论 / 0 点赞 / 0 阅读 / 0 字

📢 转载信息

原文链接:https://machinelearningmastery.com/7-numpy-tricks-to-vectorize-your-code/

原文作者:Jason Brownlee


欢迎来到Machine Learning Mastery!本文将带你了解七个强大的NumPy技巧,帮助你用向量化操作取代低效的Python循环,从而显著提升代码性能。

深入理解NumPy向量化

在科学计算和机器学习中,NumPy是核心库。使用Python的for循环处理大型数组非常慢。向量化(Vectorization)是利用NumPy底层优化的C/Fortran实现,可以对整个数组执行操作,速度远超标准Python循环。

我们将探讨以下7个NumPy技巧:

  1. 使用np.where()进行条件赋值。
  2. 使用np.logical_and()np.logical_or()进行元素级逻辑运算。
  3. 使用np.maximum()np.minimum()进行元素级最大/最小值操作。
  4. 使用np.take()进行索引操作。
  5. 使用np.clip()进行值裁剪。
  6. 使用np.searchsorted()查找插入点。
  7. 使用np.meshgrid()创建坐标网格。
NumPy 向量化技巧示意图

1. 使用 np.where() 进行条件赋值

当需要在数组中根据某个条件选择不同的值时,np.where()比使用列表推导式或循环快得多。它的语法是 np.where(condition, x, y),如果condition为True,则取x的值,否则取y的值。

import numpy as np

# 示例:将数组中小于5的元素替换为-1
arr = np.array([1, 6, 2, 8, 3, 9])
result = np.where(arr < 5, -1, arr)
print(result) 
# 输出: [-1  6 -1  8 -1  9]

2. 使用 np.logical_and()np.logical_or()

处理数组的布尔逻辑运算时,应避免使用 Python 原生的 andor,因为它们在处理整个数组时会返回单一的布尔值,而不是逐元素的结果。使用 np.logical_and()np.logical_or() 即可实现向量化的逻辑操作。

# 示例:找出元素同时大于2且小于8的元素
arr = np.array([1, 5, 9, 4, 7, 10])
condition_and = np.logical_and(arr > 2, arr < 8)
print(condition_and)
# 输出: [False  True False  True  True False]

3. 使用 np.maximum()np.minimum()

如果你需要计算两个数组对应元素的较大值或较小值,可以使用这两个函数。这比手动编写循环来比较元素要高效得多。

# 示例:计算两个数组的元素级最大值
arr1 = np.array([1, 5, 3])
arr2 = np.array([2, 4, 6])
result_max = np.maximum(arr1, arr2)
print(result_max)
# 输出: [2 5 6]

4. 使用 np.take() 进行高级索引

虽然标准的方括号索引(e.g., arr[indices])很常用,但在某些复杂或需要引用外部列表作为索引时,np.take() 提供了一种更明确、有时更灵活的方式来根据一系列索引提取元素。

arr = np.array([10, 20, 30, 40, 50])
indices = [0, 2, 4]
result = np.take(arr, indices)
print(result)
# 输出: [10 30 50]

5. 使用 np.clip() 进行值裁剪(Clamping)

np.clip(a, a_min, a_max) 可以将数组中的所有元素限制在一个指定的范围内。小于a_min的值被设置为a_min,大于a_max的值被设置为a_max。这是数据预处理中非常常见的操作。

data = np.array([-5, 10, 50, 100, 200])
clipped_data = np.clip(data, 0, 100)
print(clipped_data)
# 输出: [  0  10  50 100 100]

6. 使用 np.searchsorted() 查找插入点

如果你的数组已经排序,并且你想知道一个新值应该插入到哪里才能保持数组的有序性,np.searchsorted() 非常有用。它返回的是应该插入的索引位置。

sorted_array = np.array([10, 20, 30, 40, 50])
value_to_insert = 25
insertion_index = np.searchsorted(sorted_array, value_to_insert)
print(insertion_index)
# 输出: 2 (表示25应该插入到索引2的位置,即30的前面)

7. 使用 np.meshgrid() 创建坐标网格

在处理二维函数、绘图或需要将一维坐标向量扩展为二维(或更高维)坐标矩阵时,np.meshgrid() 是不可替代的向量化工具。它接受两个或多个一维数组,并返回多维坐标矩阵。

x = np.array([1, 2, 3])
y = np.array([10, 20])
xx, yy = np.meshgrid(x, y)

print("XX 坐标网格:\n", xx)
print("YY 坐标网格:\n", yy)

# 输出:
# XX 坐标网格:
#  [[1 2 3]
#   [1 2 3]]
# YY 坐标网格:
#  [[10 10 10]
#   [20 20 20]]

总结

掌握这七个NumPy技巧,你就能在进行数据处理和科学计算时,用更简洁、更Pythonic、最重要的是——更快速的方式编写代码。向量化是提升性能的关键,尤其是在处理大规模数据集时。




🚀 想要体验更好更全面的AI调用?

欢迎使用青云聚合API,约为官网价格的十分之一,支持300+全球最新模型,以及全球各种生图生视频模型,无需翻墙高速稳定,小白也可以简单操作。

青云聚合API官网https://api.qingyuntop.top

支持全球最新300+模型:https://api.qingyuntop.top/pricing

详细的调用教程及文档:https://api.qingyuntop.top/about

0

评论区