如何通过索引数组正确提取NumPy数组中的指定行
问题原因
- 你写的第一行代码
finding_all_infValue=np.asarray(BD[BD.min(axis=1) != np.inf])本身逻辑正确,可以正常取出所有最小值不是inf的行,报错来自后续索引计算的逻辑错误。 - 核心报错点来自
np.where的写法错误:你给判断条件BD.min(axis=1) == np.inf外层多套了一对方括号,把原本长度为数组行数的一维布尔数组,转成了形状为(1, 行数)的二维数组;无意义的维度包裹很容易搞混np.where返回值的索引顺序,导致取错下标触发索引报错。 - 额外问题:实现逻辑冗余,numpy的布尔索引本身支持直接按行筛选,不需要单独调用
np.where取索引再二次索引,多写一步反而增加出错概率。
正确实现方法
方法1:最简布尔索引(推荐)
直接把行判断条件作为下标传入数组,一步完成筛选,不需要单独计算行索引:
# 筛选整行所有值都是inf的行(和原逻辑判断min==inf的规则一致) new_array = BD[BD.min(axis=1) == np.inf]
如果实际需求是只要行内包含任意一个inf就提取该行,把判断条件替换为np.isinf的行级判断即可:
# 筛选存在至少一个inf值的行 new_array = BD[np.isinf(BD).any(axis=1)]
方法2:先取索引再筛选(适配需要复用索引的场景)
如果后续逻辑需要用到符合条件的行索引,去掉np.where条件外层多余的方括号即可,注意一维条件下np.where返回的元组第0位才是行下标:
# 注意不要给判断条件加外层[],返回值取[0]拿到行索引 indx = np.where(BD.min(axis=1) == np.inf)[0] new_array = BD[indx, :]
测试验证
可以用样例数组验证逻辑正确性:
import numpy as np BD = np.array([ [1, 2, 3], [np.inf, np.inf, np.inf], [4, np.inf, 5], [7, 8, 9] ]) # 筛选全inf行 new_array = BD[BD.min(axis=1) == np.inf] print(new_array) # 输出:[[inf inf inf]] # 筛选含任意inf的行 new_array_has_inf = BD[np.isinf(BD).any(axis=1)] print(new_array_has_inf) # 输出: # [[inf inf inf] # [ 4. inf 5.]]
内容的提问来源于stack exchange,提问作者david
相关产品推荐
相关产品推荐

