【问题标题】:I'm getting a TypeError for a += b, but not b += a (numpy)我得到 a += b 的 TypeError,但不是 b += a (numpy)
【发布时间】:2019-03-22 22:57:46
【问题描述】:

为什么我得到TypeError 的a += b 但它适用于b += a 的以下代码

import numpy as np
a = np.ones((2,3), dtype=int) 
b = np.random.random((2,3))
a += b

【问题讨论】:

    标签: python numpy typeerror


    【解决方案1】:

    报告整个 TypeError!

    ----> 3 a += b
    
    TypeError: Cannot cast ufunc add output from dtype('float64') to 
       dtype('int64') with casting rule 'same_kind'
    

    a 是整数 dtype,对吗? b 是浮动的。添加一个浮点数和整数,结果是一个浮点数。但是a+=... 预计会将浮点数放入整数数组a。 numpy 不想那样做。

    但这很好:

    In [3]: a = a + b
    In [4]: a
    Out[4]: 
    array([[1.01407496, 1.96122364, 1.91447533],
           [1.68130058, 1.99773138, 1.50043386]])
    

    原来的整数数组a现在已经被一个浮点数组代替了。这是一个 Python 级别的赋值,a+=... 尝试修改原始的 a 数组(就地)。区别很重要。

    【讨论】:

      【解决方案2】:

      错误信息会给你提示:

      TypeError: Cannot cast ufunc add output from dtype('float64') to dtype('int32') with cast rule 'same_kind'

      a 是 int32s 的数组,b 是 float64s 的数组。添加int32 和float64(不管哪个先出现),将产生float64。此值不能存储在a,但可以存储在b。

      如果您将a 定义为使用dtype=float,则a+=b 将是完全合法的:

      a = np.ones((2,3), dtype=float)
      

      【讨论】:

        【解决方案3】:

        您的变量a 是一个类型为int 的numpy 数组,而您的变量b 是一个类型为float 的numpy 数组。当将b 添加到a 时,它会尝试将这些浮点数转换为丢失信息的整数。但是,当您以相反的方式执行此操作时,您会将整数转换为浮点数,这非常好。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-03-29
          • 1970-01-01
          • 2021-10-06
          • 2011-01-20
          • 2017-07-03
          • 1970-01-01
          • 1970-01-01
          • 2019-10-27
          相关资源
          最近更新 更多