You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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)的输出看起来像“三维索引”?

这不是三维索引,而是二维数组的行、列索引拆分结果:

  1. 首先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]
  2. 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)

正确的检查方式

如果要检查[-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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 20:55:19