📢 转载信息
原文链接: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技巧:
- 使用
np.where()
进行条件赋值。 - 使用
np.logical_and()
和np.logical_or()
进行元素级逻辑运算。 - 使用
np.maximum()
和np.minimum()
进行元素级最大/最小值操作。 - 使用
np.take()
进行索引操作。 - 使用
np.clip()
进行值裁剪。 - 使用
np.searchsorted()
查找插入点。 - 使用
np.meshgrid()
创建坐标网格。

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 原生的 and
或 or
,因为它们在处理整个数组时会返回单一的布尔值,而不是逐元素的结果。使用 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
评论区