如何无需将多维数组转为一维,匹配数组值并获取对应索引(Python)
批量获取多维数组元素在参考数组中的索引(无需转一维)
你的需求很明确——不用把多维数组摊平成一维,直接批量找到每个元素在possible_val_array中的对应索引,和你之前处理单个值的逻辑对齐。
首先得说,你原来尝试的np.where(my_val_array==possible_val_array)之所以达不到预期,是因为numpy的广播机制会把possible_val_array扩展成和my_val_array相同的形状,然后返回的是所有匹配位置的坐标,而不是每个元素对应的索引值。
下面给你两种高效的向量化解决方案,都不需要转一维:
方法一:广播+np.argmax(通用场景,无需排序)
这个方法完全贴合你之前单值处理的逻辑,而且是纯向量化操作,效率很高:
import numpy as np my_val_array = np.array([(-1,2,3),(3,-1,-1)]) possible_val_array = np.array([-1, 2, 3]) # 给原多维数组增加一个维度,实现和参考数组的广播比较 matches = my_val_array[..., np.newaxis] == possible_val_array # 沿着新增的维度取argmax,找到第一个匹配的索引(和你单值取[0][0]逻辑一致) idx = np.argmax(matches, axis=-1) print(idx)
运行后输出正好是你想要的结果:
[[0 1 2] [2 0 0]]
逻辑解释:
my_val_array[..., np.newaxis]把原(2,3)的数组变成(2,3,1)的形状,这样就能和形状为(3,)的possible_val_array进行广播,生成一个(2,3,3)的布尔数组——每个元素对应my_val_array中的值是否等于possible_val_array里的某一个值。np.argmax(matches, axis=-1)会沿着最后一个维度(也就是参考数组的维度)找到第一个True(数值为1)的位置,这个位置就是对应元素在possible_val_array中的索引。- 如果
possible_val_array里有重复值,这个方法会返回第一个出现的索引,和你之前用np.where(...)取[0][0]的逻辑完全一致。
方法二:np.searchsorted(适用于参考数组已排序且无重复的场景)
如果你的possible_val_array是排序好且元素唯一的,用np.searchsorted会更快:
import numpy as np my_val_array = np.array([(-1,2,3),(3,-1,-1)]) possible_val_array = np.array([-1, 2, 3]) # 确保参考数组是排序状态(这里已经满足) sorted_vals = np.sort(possible_val_array) # 直接批量查找索引 idx = np.searchsorted(sorted_vals, my_val_array) print(idx)
这个方法的效率比第一种更高,但有前提条件:参考数组必须是排序的,且没有重复元素,否则结果会不符合预期。
内容的提问来源于stack exchange,提问作者Slash
相关产品推荐
相关产品推荐

