【问题标题】:Why does python throw a "true_divide" TypeError when using "/=" assignment on NumPy arrays?为什么 python 在 NumPy 数组上使用“/=”赋值时会抛出“true_divide”类型错误?
【发布时间】:2021-12-28 03:30:15
【问题描述】:

在创建后立即在 NumPy 数组上使用 /= 时出现 TypeError:

>>> arr = np.array([1,2,3])
>>> arr /= 2
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-89-ff91ab204368> in <module>
----> 1 arr /= 2

TypeError: No loop matching the specified signature and casting
was found for ufunc true_divide

但我可以:

>>> arr = arr / 2
>>> arr
array([0.5, 1, 1.5])

更奇怪的是,做了上面的事情之后我还能做到:

>>> arr /= 2
>>> arr
array([0.25, 0.5, 0.75])

发生了什么?

【问题讨论】:

  • 提示:使用浮点除法前后检查数组的dtype。

标签: python arrays numpy


【解决方案1】:

我相信这是因为您的数组是一个整数数组。当您执行/= 时,它会尝试进行真正的除法并将值原位放回原始数组中,但它不能,因为新值是浮点数并且数组具有整数 dtype。但是当您使用/ 时,它会创建一个具有浮点dtype 的new 数组,然后将其分配给原始名称,并且此浮点数组支持/=

【讨论】:

  • 哎呀,是的,thinko,谢谢。
  • 感谢您的回答!您对就地修改是正确的,并且在this answer 中使用 id 似乎可以证明这一点。
【解决方案2】:

答案是 ([1, 2, 3]) 是 int64 类型,如果它们是数组中的浮点数,则类型是 float64。如果您想知道您的数组是哪种类型,您可以使用“.dtype”。您可以将此 int64 数组定义为 float64 数组。

【讨论】:

    【解决方案3】:

    正如已经提到的其他答案,问题是由于dtype。让我们通过代码并尝试理解问题。
    NOTE: id() gives unique identify of object
    创建数组时

    >>> import numpy as np
    >>> arr = np.array([1,2,3])
    >>> id(arr) # Hash address of array
    139866867761280
    >>> arr.dtype # dtype of array
    dtype('int64')
    

    你可以看到数组的类型是int64。当您尝试将其除以 2 时,它会尝试将其写回到相同的 ndarray 中,其类型为 int64,结果为 float64,因此出现错误

    >>> arr /= 2
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: No loop matching the specified signature and casting was found for ufunc true_divide
    

    当你这样做时

    >>> arr = arr / 2
    >>> id(arr)
    139866844116592
    >>> arr.dtype
    dtype('float64')
    

    注意地址是如何从以前的操作中改变的,类型是如何改变的。因为地址已更改并创建了新的ndarray,因此没有错误。
    现在当你尝试arr /= 2

    >>> arr /= 2
    >>> arr
    array([0.25, 0.5 , 0.75])
    >>> arr.dtype
    dtype('float64')
    >>> id(arr)
    139866844116592
    

    因为dtype 已经是float64 我们能够执行该操作。请注意地址如何保持不变。就位操作。

    【讨论】:

    • 感谢您的回答!我不知道有用的id 功能。似乎这不仅适用于 numpy 数组,也适用于 python 列表——可能是任何支持该操作的可变对象。使用arr = arr + 2 时id 会发生变化,但使用arr += 2 时不会发生变化。
    猜你喜欢
    • 2015-02-25
    • 2021-11-13
    • 2016-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-12
    • 2019-08-28
    • 1970-01-01
    相关资源
    最近更新 更多