如何遍历可为int或array的变量?构建Numpy式多用途兼容函数
解决兼容int和int数组输入的函数实现问题
这问题我之前写工具函数时也踩过坑!核心就是要把输入统一成可迭代格式,同时不破坏原本就是数组/可迭代对象的输入。给你几个实用的方案,按需选择:
方案1:显式类型判断,统一转换
最直观的方法就是先检查输入类型,把单个int转成包含它的可迭代对象(比如列表或numpy数组),已经是可迭代的就直接用。注意要排除字符串这类“伪可迭代”对象(毕竟你要的是int相关输入):
import numpy as np def my_delete(arr, bar): # 处理Python原生int和numpy标量int if isinstance(bar, (int, np.integer)): bar = [bar] # 防止字符串这类意外输入(字符串也是可迭代的,但不符合需求) elif isinstance(bar, str): raise TypeError("String inputs are not supported for 'bar' parameter") # 现在可以放心处理可迭代的bar了 return np.delete(arr, bar)
方案2:用numpy内置函数一键统一(推荐)
numpy本身就提供了np.atleast_1d()函数,完美适配你的需求:它会把标量自动转成1维数组,原本就是数组/可迭代对象的则保持结构不变。代码超级简洁:
import numpy as np def my_delete(arr, bar): # 统一转成1维数组,兼容标量和数组输入 bar = np.atleast_1d(bar) return np.delete(arr, bar)
这个方案不用自己写复杂的类型判断,numpy帮你处理所有边界情况(比如numpy的int标量、Python原生int、列表、tuple等),省心又可靠。
方案3:鸭子类型风格——用try-except捕获异常
如果你更喜欢“鸭子类型”的写法,不想写类型判断,可以尝试先尝试处理可迭代输入,捕获到TypeError(说明是单个int)时再转成单元素对象:
import numpy as np def my_delete(arr, bar): try: # 先假设bar是可迭代的,直接调用delete return np.delete(arr, bar) except TypeError: # 捕获到不可迭代的异常,转成单元素列表再处理 return np.delete(arr, [bar])
这种写法更灵活,不过要注意:如果有其他原因导致TypeError(比如arr不是numpy数组),会被误判成bar的问题,所以如果你的函数有其他参数校验,要提前做。
额外提示
如果你的函数是处理Python原生列表而非numpy数组,逻辑也是类似的:把单个int转成[bar],然后遍历执行删除操作(注意列表删除要倒序或者先转成索引集合,避免索引偏移的问题)。
内容的提问来源于stack exchange,提问作者Neinstein
相关产品推荐
相关产品推荐

