python - numpy 数据类型转换在 x=x+a 和 x+=a 中的行为不同

标签 python numpy casting

在 python 中操作一些 numpy 数组时,我注意到 x=x+ax+=a 之间的操作存在一些差异。

我想做的是简单地向整数列表添加一些随机错误,如下所示:

x=numpy.arange(12)
a=numpy.random.random(size=12)
x+=a

但是打印出 x 给出一个整数列表 [0,1,2,3,4,5,6,7,8,9,10,11] .

事实证明,如果我改用 x=x+a,它会按预期工作。

这是我们应该注意的事情吗,我的意思是它的行为如此不同。我曾经认为 x+=ax=x+a 是完全等价的,我一直在交替使用它们而没有一直注意。现在,我对到目前为止所做的所有计算感到非常担心和焦虑。谁知道这在何时何地造成了问题,我必须仔细检查所有内容。

这是 numpy 中的错误吗?我在 numpy 版本 1.2.0 和 1.6.1 中进行了测试,他们都这样做了。

最佳答案

不,这不是错误,这是预期的行为。 += 进行就地加法,因此它不能更改数组 x 的数据类型。当 dtype 是整数时,这意味着添加 a 的元素所产生的浮点临时值将被截断为整数。由于 np.random.random 返回 [0, 1) 范围内的 float ,结果总是被截断为 x 中的值。

相比之下,x + a 无论如何都需要分配一个新数组,并且当一个参数是 float 而另一个是整数时,将新数组的 dtype 向上转换为 float。

避免此问题的最佳方法是在 arange 调用中明确说明所需的数据类型:

x = np.arange(12, dtype=float)
x += np.random.random(size=12)

(请注意,x += ax = x + a 在 Python 中很少等价,因为后者通常会修改 x 指向的对象. 例如,使用纯 Python 列表:

a = []
b = a
a += [1]

也修改 b,而 a = a + [1] 将保持 b 不变。)

关于python - numpy 数据类型转换在 x=x+a 和 x+=a 中的行为不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23407736/

相关文章:

python - 访问张量中各个元素的更好方法

python - PIL 的舍入误差

c - 只要它们包含 "next"字段,是否可以在 C 中为不同的列表结构编写通用遍历函数?

c# - 将 IList<T1> 转换为 ILIst<T2>

C++ 强制转换为 void

python - 如何使用Python正确复制 ".xlsx"文件

python - 用 matplotlib 表示体素

python - 如何创建用于在 mongoDB 数据库中搜索的网页?

python - 来自 2d numpy 数组的加权随机采样

python - 使用 numpy loadtxt