Numpy查找数组匹配值索引输出不符合预期的原因排查
问题原因
- 核心问题出在
np.where()的返回值格式上:该函数返回的是与输入数组维度一致的元组,对于一维数组匹配场景,返回格式为(匹配位置索引数组,),你直接将整个元组追加到列表a中,自然无法得到纯索引组成的结果。 - 其次,就算提取了元组中的索引数组,直接追加的话列表中会存储numpy数组对象,而非你需要的数值元素,最终输出格式也会不符合预期。
- 额外注意:原代码缺少
import numpy as np导入语句,运行前需要先补充。
修复方案
方案1:修改现有循环逻辑
仅需调整追加元素的逻辑,提取np.where返回结果中的索引值即可:
import numpy as np a = [] data = ['2007-01-03', '2007-01-04', '2007-01-05', '2007-01-08', '2007-01-09' , '2007-01-10', '2007-01-11', '2007-01-12', '2007-01-16'] data1 = ['2007-01-04', '2007-01-11'] data = np.array(data) data1 = np.array(data1) for day in data1: # 取返回元组的第一个元素(索引数组)的第一个值(单匹配场景下唯一值) a.append(np.where(day == data)[0][0]) print(a) # 输出:[1, 6]
方案2:使用向量化操作替代循环(更高效)
数据量较大时推荐用numpy内置函数避免循环,代码更简洁:
import numpy as np data = ['2007-01-03', '2007-01-04', '2007-01-05', '2007-01-08', '2007-01-09' , '2007-01-10', '2007-01-11', '2007-01-12', '2007-01-16'] data1 = ['2007-01-04', '2007-01-11'] data = np.array(data) data1 = np.array(data1) # np.in1d返回data中元素是否存在于data1的布尔数组,np.where取对应索引 a = np.where(np.in1d(data, data1))[0] print(a) # 输出:[1 6],如需转Python列表可调用.tolist()方法
内容的提问来源于stack exchange,提问作者DreamyDeerz
相关产品推荐
相关产品推荐

