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)