Python列表为何可与np.float64相减却无法与int类型相减?
关于Python列表与不同数值类型减法的问题解答
嘿,这个问题问得很到位,我来给你拆解明白到底是怎么回事~
为什么l - np.float64(1)能正常运行?
其实这不是Python原生列表的能力,而是numpy数值类型的“主动适配”:
- numpy的
np.float64这类数值对象重载了减法运算符(__sub__方法),当它遇到右侧是Python列表时,会自动把列表转换成numpy数组。 - 之后利用numpy的广播机制,把标量
np.float64(1)和数组里的每个元素逐一做减法,最后返回一个numpy数组。你可以打印type(m)看看,结果会是<class 'numpy.ndarray'>,已经不是原来的列表啦。
举个实际验证的例子:
import numpy as np l = [1,2,3,4] m = l - np.float64(1) print(type(m)) # 输出 <class 'numpy.ndarray'> print(m) # 输出 [0. 1. 2. 3.]
为什么l - 2会报错?
Python原生的list类型根本就没设计和整数(或其他原生数值类型)的减法操作!
列表支持的算术运算只有两种:
+:用来拼接两个列表,比如[1,2] + [3,4]得到[1,2,3,4]*:用来重复列表内容,比如[1,2]*3得到[1,2,1,2,1,2]
除此之外的减、乘(和数字)、除等运算,列表都不支持,所以直接执行l - 2会抛出TypeError: unsupported operand type(s) for -: 'list' and 'int'。
如果想实现列表和整数的减法,怎么办?
给你两个常用的解决办法:
- 用列表推导式:手动遍历列表每个元素做减法,返回新列表
n = [x - 2 for x in l] - 先把列表转成numpy数组,再做减法(和你之前的numpy操作逻辑一致)
n = np.array(l) - 2
内容的提问来源于stack exchange,提问作者Masker Wong
相关产品推荐
相关产品推荐

