【发布时间】: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
【问题讨论】:
为什么我得到TypeError 的a += b 但它适用于b += a 的以下代码
import numpy as np
a = np.ones((2,3), dtype=int)
b = np.random.random((2,3))
a += b
【问题讨论】:
报告整个 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 数组(就地)。区别很重要。
【讨论】:
错误信息会给你提示:
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)
【讨论】:
您的变量a 是一个类型为int 的numpy 数组,而您的变量b 是一个类型为float 的numpy 数组。当将b 添加到a 时,它会尝试将这些浮点数转换为丢失信息的整数。但是,当您以相反的方式执行此操作时,您会将整数转换为浮点数,这非常好。
【讨论】: