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

如何用Python获取Numpy数组中子数组的所有匹配位置?

问题

给定形状为(s₁,...,sₖ)的Numpy数组C,以及另一个形状为(sⱼ,...,sₖ)(其中j > 1)的数组A,是否存在Python函数可以返回位置列表[p₁,...,pₗ]?其中每个pᵣ的形式为[x₁,...,xⱼ₋₁],需满足C[x₁,...,xⱼ₋₁] == A。

手动实现代码

我尝试了手动嵌套循环的实现方式:

import numpy as np

# C 是形状为 (3, 2, 3) 的数组
C = np.array([
    [[5, 7, 1], [0, 2, 1]],
    [[4, 7, 2], [-1, 2, 2]],
    [[3, 7, 3], [-3, 2, 3]]
])
# A 是形状为 (3) 的数组
A = np.array([-1, 2, 2])
pos_list = []
for i in range(C.shape[0]):
    for j in range(C.shape[1]):
        if np.all(C[i, j] == A):
            pos_list.append([i, j])

print(pos_list)

输出结果

[[1, 1]]

更高效的Numpy原生实现

不需要手动写循环,利用Numpy的广播和数组操作可以更简洁高效地完成需求:

import numpy as np

C = np.array([
    [[5, 7, 1], [0, 2, 1]],
    [[4, 7, 2], [-1, 2, 2]],
    [[3, 7, 3], [-3, 2, 3]]
])
A = np.array([-1, 2, 2])

# 生成布尔掩码,标记所有匹配A的子数组位置
match_mask = np.all(C == A, axis=tuple(range(len(A.shape), len(C.shape))))
# 获取所有匹配位置的坐标并转为列表
positions = np.argwhere(match_mask).tolist()

print(positions)

代码解释

  • C == A:Numpy会自动将A广播到与C匹配的形状,逐元素比较得到布尔数组。
  • np.all(..., axis=...):沿着A对应的维度(即从len(A.shape)到C最后一维的轴)取逻辑与,得到形状为(s₁,...,sⱼ₋₁)的布尔掩码,其中True表示对应位置的子数组与A完全匹配。
  • np.argwhere(match_mask):返回掩码中所有True值的坐标,再通过.tolist()转为列表格式,就是需要的位置列表。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 02:37:04