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

如何判断二维NumPy数组中两个一维切片是否垂直相交?

判断Numpy切片是否垂直相交

问题场景

创建了一个9x9的二维数组:

arr = np.zeros((9,9), dtype=object)

得到两个一维切片:

  • 形状为(1,5)的水平切片:a = arr[1:2, 3:8]
  • 形状为(5,1)的垂直切片:b = arr[0:5, 4:5]

需要从数学层面判断这两个切片是否垂直相交,此前使用np.may_share_memory(a,b)无效——只要切片来自同一原数组,该方法就返回True,无法判断是否有重叠元素。

核心判断逻辑

垂直相交的本质是:

  • 水平切片(单行多列)的行号落在垂直切片(多行单列)的行区间内
  • 垂直切片的列号落在水平切片的列区间内

同时满足这两个条件时,两个切片会在(水平行号, 垂直列号)这个点相交。

实现方案

方案1:直接记录切片索引(推荐)

如果能在切片时记录行/列的切片参数,直接通过索引范围判断:

import numpy as np

arr = np.zeros((9,9), dtype=object)

# 记录切片的索引范围
a_row = slice(1, 2)
a_col = slice(3, 8)
a = arr[a_row, a_col]

b_row = slice(0, 5)
b_col = slice(4, 5)
b = arr[b_row, b_col]

# 提取关键索引
horizontal_row = a_row.start  # 水平切片的唯一行号
vertical_col = b_col.start    # 垂直切片的唯一列号

# 判断相交条件
row_in_range = (horizontal_row >= b_row.start) and (horizontal_row < b_row.stop)
col_in_range = (vertical_col >= a_col.start) and (vertical_col < a_col.stop)

if row_in_range and col_in_range:
    print(f"切片在({horizontal_row}, {vertical_col})垂直相交")
else:
    print("切片不垂直相交")

方案2:从切片对象推导索引范围

如果只能拿到切片后的数组对象,可以通过__array_interface__属性推导原数组中的索引范围:

import numpy as np

def get_slice_bounds(slice_arr, original_shape):
    """获取切片在原数组中的行、列起始/结束索引"""
    interface = slice_arr.__array_interface__
    strides = interface['strides']
    offset = interface['data'][0]
    elem_size = slice_arr.dtype.itemsize

    # 计算行范围
    row_start = offset // (original_shape[1] * elem_size)
    row_end = row_start + slice_arr.shape[0]

    # 计算列范围
    col_start = (offset % (original_shape[1] * elem_size)) // elem_size
    col_end = col_start + slice_arr.shape[1]

    return (row_start, row_end), (col_start, col_end)

# 测试代码
arr = np.zeros((9,9), dtype=object)
a = arr[1:2, 3:8]
b = arr[0:5, 4:5]

# 获取切片的行列范围
(a_rows, a_cols), (b_rows, b_cols) = get_slice_bounds(a, arr.shape), get_slice_bounds(b, arr.shape)

# 判断相交
horizontal_row = a_rows[0]
vertical_col = b_cols[0]

row_in = (horizontal_row >= b_rows[0]) and (horizontal_row < b_rows[1])
col_in = (vertical_col >= a_cols[0]) and (vertical_col < a_cols[1])

print(f"是否相交:{row_in and col_in}")

为什么np.may_share_memory不适用

np.may_share_memory仅判断两个数组是否共享原数组的内存空间,只要切片来自同一个原数组,无论是否有重叠元素,都会返回True,无法精准判断切片是否相交。

内容的提问来源于stack exchange,提问作者Ahmed4end

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 12:02:36