欢迎光临优选殡葬网
详情描述

np.where() 是 NumPy 中非常强大且灵活的函数,主要有两种使用模式。让我为你详细解析这两种神奇用法:

1. 第一种用法:条件筛选(三目运算模式)

这是 np.where() 最基本的形式,类似于三元运算符:

import numpy as np

# 语法:np.where(condition, x, y)
# 当condition为True时返回x,否则返回y

arr = np.array([1, 2, 3, 4, 5])
result = np.where(arr > 3, arr, 0)
print(result)  # 输出:[0 0 0 4 5]

# 实际示例:成绩等级划分
scores = np.array([85, 62, 90, 45, 78])
grades = np.where(scores >= 90, 'A', 
                 np.where(scores >= 80, 'B',
                         np.where(scores >= 70, 'C',
                                 np.where(scores >= 60, 'D', 'F'))))
print(grades)  # 输出:['B' 'D' 'A' 'F' 'C']

特点:

  • 返回与 condition 相同形状的数组
  • x 和 y 可以是标量或数组
  • 常用于数据清洗和条件赋值

2. 第二种用法:查找符合条件的索引

当只传入一个参数(condition)时,np.where() 返回满足条件的元素索引:

import numpy as np

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

# 查找值为4的所有位置
indices = np.where(arr == 4)
print(indices)  # 输出:(array([3, 5]),)
print(arr[indices])  # 输出:[4 4]

# 二维数组示例
matrix = np.array([[1, 2, 3],
                   [4, 5, 6],
                   [7, 8, 9]])

# 查找大于5的元素位置
rows, cols = np.where(matrix > 5)
print("行索引:", rows)    # 输出:[1 2 2 2]
print("列索引:", cols)    # 输出:[2 0 1 2]

# 获取满足条件的值
values = matrix[rows, cols]
print("值:", values)     # 输出:[6 7 8 9]

高级应用示例:

import numpy as np

# 示例1:数据清洗 - 替换异常值
data = np.array([1, 2, 99, 4, 5, 99, 7])
cleaned = np.where(data > 50, np.mean(data[data <= 50]), data)
print("清洗后:", cleaned)

# 示例2:图像处理 - 阈值化
image = np.random.randint(0, 256, size=(5, 5))
thresholded = np.where(image > 128, 255, 0)
print("阈值化图像:\n", thresholded)

# 示例3:查找极值点
x = np.linspace(0, 10, 100)
y = np.sin(x)
# 查找局部最大值(简化示例)
peak_indices = np.where((y[1:-1] > y[:-2]) & (y[1:-1] > y[2:]))[0] + 1
print("极值点位置:", peak_indices)

# 示例4:多条件查找
arr = np.array([[1, 0, 3],
                [0, 5, 0],
                [7, 0, 9]])

# 查找非零元素
rows, cols = np.where(arr != 0)
print("非零元素位置:")
for r, c in zip(rows, cols):
    print(f"  ({r}, {c}) = {arr[r, c]}")

性能对比和最佳实践

import numpy as np
import time

# 创建大型数组
arr = np.random.randn(1000000)

# 方法1:使用np.where(推荐)
start = time.time()
result1 = np.where(arr > 0, arr, 0)
time1 = time.time() - start

# 方法2:使用Python循环(不推荐)
start = time.time()
result2 = np.zeros_like(arr)
for i in range(len(arr)):
    if arr[i] > 0:
        result2[i] = arr[i]
time2 = time.time() - start

print(f"np.where() 耗时: {time1:.4f}秒")
print(f"Python循环耗时: {time2:.4f}秒")
print(f"加速比: {time2/time1:.1f}倍")

总结对比

特性 第一种用法(三目运算) 第二种用法(索引查找)
参数数量 3个(condition, x, y) 1个(condition)
返回值 新数组(与condition同形) 元组(索引数组)
主要用途 条件赋值、数据转换 查找元素位置
性能 向量化操作,速度快 同样高效
广播支持

实用技巧

# 技巧1:使用np.where进行复杂条件操作
arr = np.array([1, -2, 3, -4, 5])
result = np.where(arr > 0, np.sqrt(arr), np.sqrt(-arr))
print("绝对值的平方根:", result)

# 技巧2:结合其他NumPy函数
matrix = np.array([[1, 2], [3, 4]])
# 查找最大值的所有位置
max_positions = np.where(matrix == np.max(matrix))
print("最大值位置:", max_positions)

# 技巧3:处理缺失值(配合掩码)
data = np.array([1, 2, np.nan, 4, np.nan, 6])
mask = np.isnan(data)
filled = np.where(mask, 0, data)
print("填充后:", filled)

np.where() 的核心优势在于:

代码简洁:一行代码完成复杂的条件逻辑 性能优异:底层使用C实现,避免Python循环 灵活性高:支持广播和数组操作 内存友好:避免创建中间数组

掌握这两种用法,可以让你在处理数组数据时更加得心应手!

相关帖子
2026年,租房落户政策是否覆盖了更多的新一线和二三线城市?
2026年,租房落户政策是否覆盖了更多的新一线和二三线城市?
如何自行检查家中的水管、电路和燃气管道是否存在老化或泄露风险?
如何自行检查家中的水管、电路和燃气管道是否存在老化或泄露风险?
Mac怎么忘记WiFi网络? Mac删除无用WiFi连接重新登录的技巧
Mac怎么忘记WiFi网络? Mac删除无用WiFi连接重新登录的技巧
对于在家办公的自由职业者,哪些合理的家庭办公开支有可能在计算税款时进行抵扣?
对于在家办公的自由职业者,哪些合理的家庭办公开支有可能在计算税款时进行抵扣?
隔夜饭菜中的亚硝酸盐含量真的足以威胁健康吗?
隔夜饭菜中的亚硝酸盐含量真的足以威胁健康吗?
张掖市企业网站建设开发-外贸网站建设,提供一站式建站服务
张掖市企业网站建设开发-外贸网站建设,提供一站式建站服务
南平市网站SEO优化#网站搭建服务,收费透明
南平市网站SEO优化#网站搭建服务,收费透明
果洛殡葬服务价格|白事服务公司,追悼会殡礼
果洛殡葬服务价格|白事服务公司,追悼会殡礼
长沙市丧葬服务办理-白事悼念会服务,正规专业
长沙市丧葬服务办理-白事悼念会服务,正规专业
在补办身份证期间,急需乘坐高铁或住酒店,应该办理什么临时证件?
在补办身份证期间,急需乘坐高铁或住酒店,应该办理什么临时证件?
2026年,劳动者被辞退时,经济补偿金的N究竟应该如何计算?
2026年,劳动者被辞退时,经济补偿金的N究竟应该如何计算?
5G套餐普及后,降档到4G套餐是否还能满足日常的社交与娱乐需求?
5G套餐普及后,降档到4G套餐是否还能满足日常的社交与娱乐需求?
2026年去派出所开具户籍证明,整个流程通常需要花费多长时间?
2026年去派出所开具户籍证明,整个流程通常需要花费多长时间?
身份证丢失后,是否会直接影响名下绑定的银行卡和手机卡安全?
身份证丢失后,是否会直接影响名下绑定的银行卡和手机卡安全?
唐山市苹果系统app开发#商城网站开发建设,专业建站公司
唐山市苹果系统app开发#商城网站开发建设,专业建站公司
如何帮助孩子在课后服务时段与不同年级的同学进行良性的互动和共同学习?
如何帮助孩子在课后服务时段与不同年级的同学进行良性的互动和共同学习?
家用电器待机功耗不容小觑,如何彻底关闭这些“隐形”的电能消耗?
家用电器待机功耗不容小觑,如何彻底关闭这些“隐形”的电能消耗?
乌鲁木齐市独立网站制作-精准获客引流,模板建站
乌鲁木齐市独立网站制作-精准获客引流,模板建站
2026年,我们普通人可以通过哪些日常小事为保护野生动物贡献力量?
2026年,我们普通人可以通过哪些日常小事为保护野生动物贡献力量?
沈阳市殡仪服务公司,殡葬服务车出租,全城服务
沈阳市殡仪服务公司,殡葬服务车出租,全城服务