Numpy中np.can_cast与astype判断可转float结果不一致如何解决
结果差异的核心原因
np.can_cast是类型层面的转换规则检查,仅判断输入数据的dtype是否可以按指定的casting规则转换为目标dtype,完全不会校验数组内的实际元素值。你的数组b因为存在字符串元素,整体dtype为字符串类型,所以每一列传入np.can_cast时的判断逻辑完全相同:- 当
casting='safe'时,numpy判定字符串类型不能安全转换为float,所以所有列都返回False - 当
casting='unsafe'时,numpy允许字符串类型到float的不安全转换,所以所有列都返回True,哪怕第三列存在无法转换的'Aff'也不会触发检查
- 当
- 你自定义的
func是值层面的校验,会实际尝试把整列所有元素转换为float,只要有一个元素转换失败就捕获异常返回False,所以第三列会正确返回False,这才是符合你需求的输出。
代码调整方案
如果你的需求是逐列检查所有元素都可以实际转换为float,不需要使用np.can_cast,你当前的func逻辑已经是正确的。如果需要提升大数组的检查效率,可以用如下优化写法:
import numpy as np def check_col_convertible(col): # 仅捕获转换失败的ValueError,避免吞掉其他异常 try: col.astype(np.float64) return True except ValueError: return False b = np.array([[1,2,'Aff'], [4,5,8], [7,8,9]]) # 逐列检查 result = [check_col_convertible(b[:, i]) for i in range(b.shape[1])] print(result)
如果需要兼容小数、科学计数法、正负号等各类合法float格式,上述基于try-except的写法是兼容性最高的方案,比基于字符串规则判断的方法准确率更高。
内容的提问来源于stack exchange,提问作者Thomas Schmitt
相关产品推荐
相关产品推荐

