如何检查数值是否在二维numpy数组第一列及解决vstack索引错误
解决NumPy空数组vstack时的索引错误及高效检查第一列元素的方案
这个问题我之前也碰到过,核心问题就是初始的A1 = np.array([])是一维空数组,当你第一次尝试访问A1[:,0]时,二维索引对一维数组不适用,自然就触发了IndexError。下面给你几个更优雅的解决方案,同时明确如何正确检查数值是否在二维NumPy数组的第一列:
方案一:直接初始化二维空数组
最直接的办法就是一开始就把A1定义成符合后续需求的二维空数组,指定好列数(和A2的列数一致),这样后续的索引操作就不会出错了:
import numpy as np # 初始化一个0行2列的二维空数组,列数和A2的元素个数匹配 A1 = np.empty((0, 2)) numbers = [1,2,3,3,4,4,5,6,7,8,9] for number in numbers: # 此时A1[:,0]是一个空的一维数组,number not in 空数组会返回True if number not in A1[:,0]: A2 = [number, 10] A1 = np.vstack((A1, A2))
方案二:先判断数组是否为空再处理
如果不想一开始就固定列数(比如A2的长度可能动态变化),可以先检查A1是否为空,为空时直接将A2转为二维数组赋值给A1,后续再正常判断第一列:
import numpy as np A1 = np.array([]) numbers = [1,2,3,3,4,4,5,6,7,8,9] for number in numbers: # 用size判断数组是否为空,为空时直接初始化二维数组 if A1.size == 0: A2 = [number, 10] A1 = np.array([A2]) # 把A2包装成二维数组 else: # 数组非空时,正常访问第一列判断 if number not in A1[:,0]: A2 = [number, 10] A1 = np.vstack((A1, A2))
方案三:用集合优化查询效率(大数据量推荐)
如果你的numbers列表很大,用number not in A1[:,0]的时间复杂度是O(n)(每次都要遍历第一列),效率很低。这时候可以维护一个集合来记录已经存在的数值,查询速度是O(1),大幅提升效率:
import numpy as np A1 = np.empty((0, 2)) # 用集合存储已经出现过的number,快速判断是否存在 existing_numbers = set() numbers = [1,2,3,3,4,4,5,6,7,8,9] for number in numbers: if number not in existing_numbers: existing_numbers.add(number) A2 = [number, 10] A1 = np.vstack((A1, A2))
关于如何检查数值是否在二维NumPy数组的第一列
这里分三种情况处理:
- 数组非空且确定是二维数组:直接用
value in arr[:,0],arr[:,0]会返回第一列的一维数组,in操作会遍历这个数组判断值是否存在。 - 数组可能为空:必须先判断数组是否为空(比如
arr.size == 0或者len(arr) == 0),为空时可以根据场景返回True(比如第一次添加元素)或者False,避免触发索引错误。 - 大数据量高效查询:像方案三那样维护一个对应第一列的集合,用
value in 集合来判断,这是大样本下最优的方式。
内容的提问来源于stack exchange,提问作者obchardon
相关产品推荐
相关产品推荐

