为什么对刚创建的NumPy数组使用/=赋值会抛出true_divide相关TypeError?
问题原因
核心是NumPy数组的原地运算规则和数据类型(dtype)转换限制导致的:
- 刚创建的
arr = np.array([1,2,3])默认dtype为整数类型(通常是int32或者int64,取决于操作系统) /=属于原地运算符,执行运算时默认遵循safe类型转换规则:不允许将浮点型计算结果直接写入整数类型的数组,因为该转换会丢失小数部分,属于不安全的类型转换,因此直接抛出TypeError- 执行
arr = arr / 2时不属于原地操作,NumPy会直接创建一个新的浮点类型数组存储计算结果,再把变量arr指向这个新数组,此时arr的dtype已经变更为浮点类型 - 后续再执行
arr /= 2时,运算对象本身已经是浮点类型,计算结果也为浮点类型,不存在不安全的类型转换,因此可以正常运行。
你可以通过打印dtype验证这个逻辑:
>>> arr = np.array([1,2,3]) >>> print(arr.dtype) int64 >>> arr = arr /2 >>> print(arr.dtype) float64
如果确实需要对整数数组原地执行除法,可以显式指定casting规则(注意会直接截断小数部分):
>>> arr = np.array([1,2,3]) >>> np.divide(arr, 2, out=arr, casting='unsafe') >>> arr array([0, 1, 1])
内容的提问来源于stack exchange,提问作者Shudipto Amin
相关产品推荐
相关产品推荐

