为何NumPy数组中in运算符返回True?np.where输出维度存疑
问题解析:NumPy数组
in操作与np.where的行为差异 为什么point in mypolygon返回True?
核心问题是NumPy数组的in操作逻辑和Python列表完全不同:
- Python列表的
in会检查整个元素是否存在(比如判断[-1,0]是否作为一个完整子列表存在); - 但NumPy数组的
in是检查数组中是否有任意元素等于目标序列中的任意元素。
你的point = [-1,0],mypolygon里存在-1(第3行第一个元素)和0(多个位置),所以in操作直接返回True,这和你期望的“检查整个点是否存在”逻辑完全不符。
为什么np.where(mypolygon == point)的输出看起来像“三维索引”?
这不是三维索引,而是二维数组的行、列索引拆分结果:
- 首先
mypolygon == point会触发NumPy的广播机制:把长度为2的point和mypolygon的每一行逐一比较,生成一个(9,2)形状的布尔数组,每个位置表示该元素是否等于point对应位置的元素。比如:- 第0行
[0,0]和[-1,0]比较,得到[False, True] - 第2行
[-1,1]和[-1,0]比较,得到[True, False] - 第8行
[0,0]和[-1,0]比较,得到[False, True]
- 第0行
np.where处理二维布尔数组时,会返回两个数组:第一个数组是所有True元素的行索引,第二个是对应的列索引。你看到的(array([0, 2, 8]), array([1, 0, 1]))意思是:- 行0、列1的元素(值为0)等于
point的列1元素(0) - 行2、列0的元素(值为-1)等于
point的列0元素(-1) - 行8、列1的元素(值为0)等于
point的列1元素(0)
- 行0、列1的元素(值为0)等于
正确的检查方式
如果要检查[-1,0]是否作为完整的行存在于mypolygon中,可用逐行全匹配的方式:
import numpy as np mypolygon = np.array([[0,0],[-3,1],[-1,1],[-2,4],[1,1],[3,3],[3,-2],[0,-2],[0,0]]) point = [-1, 0] # 检查整个点是否存在 is_present = (mypolygon == point).all(axis=1).any() print(is_present) # 输出False,符合预期 # 获取匹配的行索引(如果有的话) match_rows = np.where((mypolygon == point).all(axis=1)) print(match_rows) # 输出(array([], dtype=int64),),表示无匹配行
内容的提问来源于stack exchange,提问作者NoRivers
相关产品推荐
相关产品推荐

