如何判断二维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
相关产品推荐
相关产品推荐

