【问题标题】:Addition of list and NumPy number添加列表和 NumPy 编号
【发布时间】:2023-04-06 09:13:02
【问题描述】:

如果将整数添加到列表中,则会收到列表的 __add__ 函数引发的错误(我想):

>>> [1,2,3] + 3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate list (not "int") to list

如果将列表添加到 NumPy 数组中,我假设 NumPy 数组的 __add__ 函数将列表转换为 NumPy 数组并添加列表

>>> np.array([3]) + [1,2,3]
array([4, 5, 6])

但是接下来会发生什么?

>>> [1,2,3] + np.array([3])
array([4, 5, 6])

列表如何知道如何处理 NumPy 数组的加法?

【问题讨论】:

  • “列表如何知道如何处理 numpy 数组的加法。” - 它不会,[1,2,3].__add__(np.array([3])) 会失败,但如果第一个,Python 会反转参数尝试失败并且np.array([3]).__radd__([1,2,3])(如果__radd__ 未定义,则调用__add__)有效。
  • @jonrsharpe 不应该调用__radd__ 吗?
  • @Christoph 如果已定义,是的;澄清
  • @jonrsharpe:我不认为a + b 会打电话给b.__add__。 Python 不假定加法是可交换的。您可能会想到增强的赋值运算符,其中a += b 将首先尝试a.__iadd__,然后在必要时回退到__add__(并进一步到b.__radd__)。
  • @Blckknght 你说得对,我想这就是我的想法。

标签: python list numpy


【解决方案1】:

list 不知道如何处理 NumPy 数组的加法。即使在[1,2,3] + np.array([3]) 中,处理加法的也是 NumPy 数组。

作为documented in the data model:

  • 对于对象 x 和 y,首先尝试 x.__op__(y)。如果这未实现或返回 NotImplemented,则尝试 y.__rop__(x)。如果 这也没有实现或返回 NotImplemented,一个 TypeError 引发异常。但请参阅以下异常:

  • 上一项的例外:如果左操作数是内置类型或新样式类的实例,而右操作数是 该类型或类的适当子类的实例并覆盖 base 的__rop__() 方法,右操作数的__rop__() 方法是 在左操作数的__op__() 方法之前尝试。

当你这样做时

[1,2,3] + np.array([3])

内部调用的是

np.array([3]).__radd__([1,2,3])

【讨论】:

    【解决方案2】:

    这是因为 np.array 的 __radd__ 方法,请查看此链接:http://www.rafekettler.com/magicmethods.html#numeric(反射算术运算符段落)。

    事实上,当您尝试[1,2,3].__add__(np.array([3])) 时,它会引发错误,因此会调用np.array([3]).__radd__([1,2,3])

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-06
      • 2020-10-14
      相关资源
      最近更新 更多