Python 从列表中减去数字不引发TypeError
如果我这样做 我得到Python 从列表中减去数字不引发TypeError,python,list,numpy,array-broadcasting,Python,List,Numpy,Array Broadcasting,如果我这样做 我得到TypeError:-:'list'和'int'的不支持的操作数类型 但是,我有一个列表b,由np.float64组成,下面的代码可以工作: a = [1, 2, 7] a - a[-1] 我认为这是因为b中的数字是np.float64,并且b多少被转换为np.array,然后广播就发生了。 但我仍然发现这种行为令人惊讶:因为列表中的所有元素都不需要具有相同的类型,如果b[0]是一个字符串呢?b-b[-1]中的操作数仍然是list和np.float64,那么为什么b-b[-
TypeError:-:'list'和'int'的不支持的操作数类型
但是,我有一个列表b
,由np.float64
组成,下面的代码可以工作:
a = [1, 2, 7]
a - a[-1]
我认为这是因为b
中的数字是np.float64
,并且b
多少被转换为np.array
,然后广播就发生了。
但我仍然发现这种行为令人惊讶:因为列表中的所有元素都不需要具有相同的类型,如果b[0]
是一个字符串呢?b-b[-1]
中的操作数仍然是list
和np.float64
,那么为什么b-b[-1]
没有引发类型错误呢
EDIT:有人回答说list
和np.array
是不同的;嗯,我知道。但是b
不是np.array
。它的行为类似于一个,但是它的类型是list
,就像我在代码片段中所说的那样
下面是b
的一个最简单的工作示例:
type(b)
# list
b - b[-1]
# array([ 281.04209146, 6.57013103, 0. ])
但是,如果将b[0]
设置为字符串,则不会得到相同的TypeError
b
# [1598.717274996219, 1324.245314569733, 1317.6751835362861]
type(b[0])
# numpy.float64
在类似于A-B
的表达式中,您回到了原始的TypeError,解释器可以将其实现为A.\uu sub.\uuuuuuuuuuuuuuuuuub)
或B.\uuuu rsub\uuuuuuuuuuuuuuuuuuuu(A)
列出实施mul
和add
但不sub
b[2]='a'
b-b[-1]
Traceback (most recent call last):
File "<#>", line 1, in <module>
b-b[-1]
TypeError: unsupported operand type(s) for -: 'list' and 'str'
np.ndarray
实现了一个\uuuu rsub\uuuu
In [29]: [1,2,3]*3
Out[29]: [1, 2, 3, 1, 2, 3, 1, 2, 3]
In [30]: [1,2,3]+[1]
Out[30]: [1, 2, 3, 1]
In [31]: [1,2,3]-3
TypeError: unsupported operand type(s) for -: 'list' and 'int'
该方法尝试将LHS转换为数组,因此该表达式与:
In [32]: [1,2,3]-np.array([1,2,3])
Out[32]: array([0, 0, 0])
# np.array([1,2,3]).__rsub__([1,2,3])
如果列表包含字符串,则此操作失败:
In [33]: np.asarray([1,2,3]) - np.array([1,2,3])
Out[33]: array([0, 0, 0])
总之,如果RHS是某种数组,它也会将LHS列表转换为数组。从这里开始,问题是这两个数组是否兼容(在形状和数据类型上)。是的,我也测试了这种行为。抱歉,如果我不清楚,我的问题是“为什么list-np.float
没有系统地引发错误?”。Numpy是“有用的”(或者贪婪的,如果不需要的话)。如果它在表达式中的任何地方使用,它会尝试无处不在。所以如果你做[1,2,3]-np.array([1,2,3])
你会得到np.array([0,0,0])
好的,那么你能澄清一下“它尝试了”吗?它执行的检查是什么?一个np.float
与一个np.ndarray
有许多相同的方法。它不是一个dev,但我可以想象通过在numpy.asarray
中包装任何非numpy对象。这就是为什么包含一个字符串的列表被转换为一个包含所有字符串的数组:np.asarray(['a',2,3])
->array(['a',2',3',dtype='1]
In [33]: np.asarray([1,2,3]) - np.array([1,2,3])
Out[33]: array([0, 0, 0])
In [35]: ['a',2,3]-np.array([1,2,3])
TypeError: ufunc 'subtract' did not contain a loop with signature matching types dtype('<U11') dtype('<U11') dtype('<U11')
In [36]: np.asarray(['a',2,3])
Out[36]:
array(['a', '2', '3'],
dtype='<U1')
b = [np.float64(10), np.float64(1)]
b - b[-1]
b - np.float64(1)
b - np.array(1.0)
np.array(b) - np.array(1.0)